首页 > 解决方案 > CSV 在 4 行中转换一行

问题描述

我有具有这种结构的更多行的 csv 文件:

+----+----+-------+------------+---------------------+--+
| ID | 1  | 2     | 3          | 4                   |  |
+----+----+-------+------------+---------------------+--+
| 5  | 12 | 500ML | 0000-00-00 | AIAB,LAV,NCCT,QC,QV |  |
+----+----+-------+------------+---------------------+--+
| 6  | 6  | 5ML   | 0000-00-00 | QV,LAV,QC,AIAB,NCCT |  |
+----+----+-------+------------+---------------------+--+

我的目标是通过所有线路实现这一目标

+---+---+---------------------+
| 1 | 5 | 12                  |
+---+---+---------------------+
| 2 | 5 | 500ML               |
+---+---+---------------------+
| 3 | 5 | 0000-00-00          |
+---+---+---------------------+
| 4 | 5 | AIAB,LAV,NCCT,QC,QV |
+---+---+---------------------+
| 1 | 6 | 6                   |
+---+---+---------------------+
| 2 | 6 | 5ML                 |
+---+---+---------------------+
| 3 | 6 | 0000-00-00          |
+---+---+---------------------+
| 4 | 6 | AIAB,LAV,NCCT,QC,QV |
+---+---+---------------------+

有什么建议吗?

标签: csv

解决方案


使用 Miller ( https://github.com/johnkerl/miller ) 并从

ID,1,2,3,4
5,12,500ML,00000000,"AIAB,LAV,NCCT,QC,QV"
6,6,5ML,00000000,"QV,LAV,QC,AIAB,NCCT"

并运行

mlr --csv --headerless-csv-output reshape -r "[0-9]" -o item,value then reorder -f item,ID,value input.csv

你将会有

1,5,12
2,5,500ML
3,5,00000000
4,5,"AIAB,LAV,NCCT,QC,QV"
1,6,6
2,6,5ML
3,6,00000000
4,6,"QV,LAV,QC,AIAB,NCCT"

漂亮的打印输出

+------+----+---------------------+
| 1    | 5  | 12                  |
| 2    | 5  | 500ML               |
| 3    | 5  | 00000000            |
| 4    | 5  | AIAB,LAV,NCCT,QC,QV |
| 1    | 6  | 6                   |
| 2    | 6  | 5ML                 |
| 3    | 6  | 00000000            |
| 4    | 6  | QV,LAV,QC,AIAB,NCCT |
+------+----+---------------------+

推荐阅读