1

我有一个包含以下列的 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 解决方案。(也欢迎替代品。)

4

2 回答 2

1

我只是使用了您粘贴在那里的示例数据。

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
于 2011-10-05T09:08:58.417 回答
0

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

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

如果您出现以下情况,请报告:

  1. 想要在所有文件中保留标题行。
  2. 由于打开的文件太多而出现错误。

要在 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 
于 2011-10-05T09:08:09.570 回答