将 csv 多列转换为单列

将 csv 多列转换为单列

我有 1 个 csv 数据,包含多列,没有标题:

5,-3,0
3,2,5
-2,4,4
0,2,1
2,-1,-2

然后我想将其转置为单列,从第一列开始。预期输出如下:

 5
 3
-2
 0
 2
-3
 2
 4
 2
-1
 0
 5
 4
 1
-2

有人知道如何解决这个问题吗?

我所做的是使用Excel公式:=INDEX($A$1:$C$4,1+INT((ROW(A1)-1)/COLUMNS($A$1:$C$4)),MOD(ROW(A1)-1+COLUMNS($A$1:$C$4),COLUMNS($A$1:$C4))+1)并以单列结束但从第一行开始。

我正在寻找更快的方法来做到这一点,例如使用脚本。

答案1

假设您的输入文件并不是绝对庞大(例如数百万行数百万个字段),因此可以容纳在内存中,然后在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk -F',' '
    { for (i=1; i<=NF; i++) a[NR,i]=$i }
    END { for (i=1; i<=NF; i++) for (j=1; j<=NR; j++) print a[j,i] }
' file
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

答案2

awk如果您有 Gnu,另一种方法datamash是执行简单的转置,指定,为 separa-t

datamash transpose -t, < file

5,3,-2,0,2
-3,2,4,2,-1
0,5,4,1,-2

然后你可以通过管道将其替换,\ntr

datamash transpose -t, < file | tr ',' '\n'
5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

答案3

我们可以使用该itertools模块及其函数chain来链接迭代器并按顺序打印它们。

python3 -c '
import sys, itertools as it
fs,rs = ",","\n"
with open(sys.argv[1]) as f:
  L = []
  for l in f:
    F = l.rstrip(rs).split(fs)
    if not len(L):
      L += [[] for i in range(0,len(F))]
    for nc,e in enumerate(F):
      L[nc].append(e)
for x in it.chain(*L): print(x)
' file

输出:-

5
3
-2
0
2
-3
2
4
2
-1
0
5
4
1
-2

相关内容