将此csv / xls拆分为基于两列的单独文件?

时间:2011-10-05 08:06:26

标签: excel bash csv split kettle

我有一个包含这些列的35 MB Excel文件:

Index, Name, Year, AgeGroup1, AgeGroup2, AgeGroup3 [...]
1, Sweden, 1950, 20, 25, 27
2, Norway, 1950, 22, 27, 28
2, Sweden, 1951, 24, 24, 22

我想根据“名称”列将文件拆分为多个csv文件(最好还根据此列中的值命名文件)。
我也希望文件按“年份”排序(但这当然可以事先在Excel中完成。)

非常感谢bash脚本或Kettle / Pentaho解决方案。 (也欢迎替代方案。)

2 个答案:

答案 0 :(得分:2)

我刚刚使用了您粘贴的示例数据。

awk oneliner可以为你做到:

 awk -F, 'NR==1{title=$0;next} { print >> ($2".csv");colse}' yourCSV

见下面的测试:

kent$  l  
total 4.0K
-rw-r--r-- 1 kent kent 136 2011-10-05 11:04 t

kent$  cat t
Index, Name, Year, AgeGroup1, AgeGroup2, AgeGroup3
1, Sweden, 1950, 20, 25, 27
2, Norway, 1950, 22, 27, 28
2, Sweden, 1951, 24, 24, 22


kent$  awk -F, 'NR==1{title=$0;next} { print >> $2".csv"}' t

kent$  head *.csv
==>  Norway.csv <==
2, Norway, 1950, 22, 27, 28

==>  Sweden.csv <==
1, Sweden, 1950, 20, 25, 27
2, Sweden, 1951, 24, 24, 22

<强>更新

 awk -F, 'NR>1{ fname=$2".csv"; print >>(fname); close(fname);}' yourCsv

答案 1 :(得分:0)

如果awk可以接受,请导出到 csv 并运行以下命令:

awk -F, '{
  print > ($2 ".csv") 
  }' OFS=, infile.csv

如果您:

报告
  1. 想要保留所有文件中的标题行。
  2. 由于打开的文件过多而导致错误。
  3. 要在Excel之外对文件进行排序:

    sort -t, -k3,3n infile.csv | awk ...
    

    编辑:这将解决大多数问题(同时打开的文件除外):

    {
      read
      printf '%s\n' "$REPLY"
      sort -bt, -k3,3
      } < infile | 
        awk -F', *' 'NR == 1 {
          h = $0; next
          }
        {
          f = $2 ".csv"
          if (!_[f]++) 
            print h > f 
          print > f 
          }' OFS=', ' 
    

    如果你点击awk实现的“太多打开文件”限制, 你可以使用这样的东西:

    awk -F, 'NR > 1 { 
      if (f) close (f)
      f = $2 ".csv"
      print > f
      }' OFS=, infile