【问题标题】:How to split CSV into CSVs? [closed]如何将 CSV 拆分为 CSV? [关闭]
【发布时间】:2018-03-30 03:20:42
【问题描述】:

我正在尝试找到一种方法将 CSV 拆分为多个 CSV,具体取决于第一列号(创建新 CSV 的任何不同数字)。 有什么想法吗?

00015,项目 1,3,5.50 00015,项目 2,3,2.50 00015,项目 3,3,1.50 00015,项目 4,3,6.50 00015,项目 5,3,8.50 00015,项目 6,3,9.50 00555,项目 1,3,5.50 00555,项目 2,3,2.50 00555,项目 3,3,1.50 00555,项目 4,3,6.50 00555,项目 5,3,8.50 00555,项目 6,3,9.50

必须创建两个 CSV:

00015,项目 1,3,5.50 00015,项目 2,3,2.50 00015,项目 3,3,1.50 00015,项目 4,3,6.50 00015,项目 5,3,8.50 00015,项目 6,3,9.50 00555,项目 1,3,5.50 00555,项目 2,3,2.50 00555,项目 3,3,1.50 00555,项目 4,3,6.50 00555,项目 5,3,8.50 00555,项目 6,3,9.50

【问题讨论】:

  • 你想用什么语言来实现这个目标?
  • 如果您知道如何读/写文件和一些字符串操作的任何基础知识,那就很简单了...首先读取 CSV,根据第一个元素将其拆分为 2 个数组,然后将这些数组分别写入文件
  • 我更喜欢powershell,但如果它可以用其他语言轻松完成,那么我会去那个
  • powershell 不是一种语言:/
  • ...我的立场是正确的:)

标签: c# python powershell csv


【解决方案1】:

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

  1. 以文本形式读取文件(不解析为 CSV):

    Get-Content foo.csv |
    
  2. 按第一个数字分组(下面的 sn-p 可以处理有效的 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")
}

这种方法甚至适用于具有相同编号的部分不相邻的文件。

【讨论】:

  • 表达式或语句中出现意外的标记 '',.*''。
  • 那里应该是-replace 而不是.replace
  • 作为单线运行时对我来说效果很好:Get-Content C:\folder\file.csv | Group-Object { $_ -replace ',.*' -replace '"' } | ForEach-Object {$_.Group | Out-File ($_.Name + ".csv")}
  • 谢谢! :)
【解决方案2】:

在 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);
}

【讨论】:

    【解决方案3】:

    如果文件中的第 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 文件中。

    【讨论】:

      【解决方案4】:

      您可以使用 pandas:大多数 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=',')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多