如何将CSV拆分为CSV?

时间:2017-10-18 09:32:10

标签: c# python powershell csv

我正在尝试找到一种方法,根据第一个列号(创建新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

4 个答案:

答案 0 :(得分:2)

至少在你的情况下在PowerShell中相当容易:

  1. 将文件作为文本读取(不解析为CSV):

    Get-Content foo.csv |
    
  2. 按第一个编号分组(以下代码段可以处理有效的CSV,因此即使引用的某些行也不是问题):

    Group-Object { $_ -replace ',.*' -replace '"' } | 
    
  3. 写入不同的文件:

    ForEach-Object {
      $_.Group | Out-File ($_.Name + ".csv")
    }
    
  4. 全部放在一起:

    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=',')