2017-10-18 204 views
-5

我想找到一种方法根据第一个列号(任何不同的数字来创建新的CSV)将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 
+0

是你想要什么语言,来实现这一目标? – Leonidas199x

+1

到目前为止您尝试过什么? –

+2

非常简单,如果你知道如何读/写文件和一些字符串操作的任何基本知识......先读取CSV,根据第一个元素将它分成两个数组,然后将这些数组写入单独的文件 –

回答

2

相当容易在PowerShell中,你的情况至少包括:

  1. 阅读文件为文本(不解析为CSV):

    Get-Content foo.csv | 
    
  2. 集团通过第一个数字(下面的代码片段可以处理有效CSV,所以即使引用了一些线不是问题。):

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

    ForEach-Object { 
        $_.Group | Out-File ($_.Name + ".csv") 
    } 
    

把它放在一起:

Get-Content foo.csv | 
Group-Object { $_ -replace ',.*' -replace '"' } | 
ForEach-Object { 
    $_.Group | Out-File ($_.Name + ".csv") 
} 

即使对于相同编号的部分不相邻的文件,此方法也可以工作。

+0

表达式或语句中的意外标记'',。*''。 – dimitris

+1

应该是'-replace'而不是''replace'那里 – TessellatingHeckler

+0

当它作为一行代码运行时对我很好:'Get-Content C:\ folder \ file.csv | Group-Object {$ _ -replace',。*'-replace'“'} | ForEach-Object {$ _。Group | Out-File($ _。Name +”.csv“)}' –

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); 
} 
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文件中。

0

你可以用熊猫:大多数Python的解决方案:)

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