我正在尝试找到一种方法,根据第一个列号(创建新CSV的任何不同数字)将CSV拆分为多个CSV。 有什么想法吗?
00015,item 1,3,5.50 00015,item 2,3,2.50 00015,item 3,3,1.50 00015,item 4,3,6.50 00015,item 5,3,8.50 00015,item 6,3,9.50 00555,item 1,3,5.50 00555,item 2,3,2.50 00555,item 3,3,1.50 00555,item 4,3,6.50 00555,item 5,3,8.50 00555,item 6,3,9.50
必须创建两个CSV:
00015,item 1,3,5.50 00015,item 2,3,2.50 00015,item 3,3,1.50 00015,item 4,3,6.50 00015,item 5,3,8.50 00015,item 6,3,9.50
00555,item 1,3,5.50 00555,item 2,3,2.50 00555,item 3,3,1.50 00555,item 4,3,6.50 00555,item 5,3,8.50 00555,item 6,3,9.50
答案 0 :(得分:2)
至少在你的情况下在PowerShell中相当容易:
将文件作为文本读取(不解析为CSV):
Get-Content foo.csv |
按第一个编号分组(以下代码段可以处理有效的CSV,因此即使引用的某些行也不是问题):
Group-Object { $_ -replace ',.*' -replace '"' } |
写入不同的文件:
ForEach-Object {
$_.Group | Out-File ($_.Name + ".csv")
}
全部放在一起:
Get-Content foo.csv |
Group-Object { $_ -replace ',.*' -replace '"' } |
ForEach-Object {
$_.Group | Out-File ($_.Name + ".csv")
}
即使对于具有相同数字的部分不相邻的文件,此方法也适用。
答案 1 :(得分:0)
在c#中你可以使用GroupBy来执行此操作
foreach(var csv in File.ReadLines(path)
.Select(l => l.Split(','))
.GroupBy(l => l[0]))
{
var newpath = Path.Combine(Path.GetDirectoryName(path),
Path.GetFileNameWithoutExtension(path) + $"_{csv.Key}.csv")
File.WriteAllLines(newpath, csv);
}
答案 2 :(得分:0)
如果文件中的第1列值可能不连续,则以下方法将确保所有条目一起写入。每个CSV文件的文件名基于第1列值:
from collections import defaultdict
import csv
data = defaultdict(list)
with open('input.csv', 'rb') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
for row in csv_input:
data[row[0].strip()].append(row)
for title, entries in data.items():
with open("{}.csv".format(title), 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(header)
csv_output.writerows(entries)
这适用于Python 2.x.如果文件不包含标题,请删除两个标题相关的行。目前,它会将主CSV文件中的标题复制到所有子CSV文件中。
答案 3 :(得分:0)
你可以使用熊猫:大多数pythonic解决方案:)
import pandas pd
data = pd.read_csv('filename', sep=',', header=None)
frame = pd.DataFrame(data)
for i, x in enumerate(frame.groupby(frame[0])):
x[1].to_csv(open('{}.csv'.format(i),'w'), header=False,sep=',')