簡體   English   中英

CSV - 將多行單元格拆分為多個單元格

[英]CSV - Split multiple-line cell into multiple cells

我目前正在做一些大數據工作。 我在 a.CSV 中有一個問題,我需要將多行單單元文本塊拆分為單個單元格。 下表顯示了所需的 output。 目前,所有“成分”都在同一個單元格中,每種成分都有自己的新行(Stack Overflow 不允許我在同一個單元格中創建新行)。

我需要編寫一個腳本來將這個單一的成分單元格拆分為下面的 output,使用單元格中的每個新行作為分隔符。 我使用它的實際用例要復雜得多——超過 200 個“項目”,每個“項目”有 50-150 個“成分”。 我目前正在 excel 中手動執行此操作,其中包含一系列文本到列和轉置粘貼,但大約需要 2-2.5 個完整工作日。

鏈接到數據

下面的代碼

物品 原料
咖啡 咖啡豆
牛奶
import pandas as pd

df = pd.read_csv(r'd:\Python\menu.csv', delimiter=';', header=None)
headers = ["Item", "Ingredients"]
df.columns = headers
df["Ingredients"]=df["Ingredients"].str.split("\n")
df = df.explode("Ingredients").reset_index(drop=True)
df.to_csv(r"D:\Python\output.csv")

使用您的代碼和鏈接數據將分隔符更改為逗號,如下所示。

import pandas as pd

df = pd.read_csv('Inventory.csv', delimiter=',')
df["Software"]=df["Software"].str.split("\n")
df = df.explode("Software").reset_index(drop=True)

# Remove rows having empty string under Software column.
df = df[df['Software'].astype(bool)]

df = df.reset_index(drop=True)
df.to_csv("out_Inventory.csv")

print(df.to_string())

Output

        Hostname                                                                                                                Software
0    ServerName1        Windows Driver Package - Amazon Inc. (AWSNVMe) SCSIAdapter  (08/27/2019 1.3.2.53)  [version 08/27/2019 1.3.2.53]
1    ServerName1                                                                               Airlock Digital Client  [version 4.7.1.0]
2    ServerName1                                                                 AppFabric 1.1 for Windows Server  [version 1.1.2106.32]
3    ServerName1                                                                                   BlueStripe Collector  [version 8.0.3]
...

這是使用 Python 的標准csv ^1 ^2模塊的方法:

import csv

writer = csv.writer(open('output.csv', 'w', newline=''))

reader = csv.reader(open('input.csv', newline=''))

writer.writerow(next(reader))  # copy header

for row in reader:
    item  = row[0]
    ingredients = row[1].split('\n')
    
    first_ingredient = ingredients[0]
    
    writer.writerow([item, first_ingredient])

    for ingredient in ingredients[1:]:
        writer.writerow([None, ingredient])  # None for a blank cell (under the item)

鑒於你的小樣本,我得到這個:

物品 原料
咖啡 咖啡豆
牛奶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM