我正在考虑以下问题。
我可以有一个像
这样的字符串数组Col1 Col2 Col3 Col4
aa aa aa aa
aaa aaa aaaaa aaa
aaaa aaaaaaa aa a
...........................
实际上它是CSV
文件。我应该找到一种方法将其垂直划分为一个或多个文件。拆分条件是没有一个文件不包含超过某些字节的行。为简单起见,我们可以用长度重写该数组:
Col1 Col2 Col3 Col4
2 2 2 2
3 3 5 3
4 7 2 1
...........................
让我们说限制为10
,即如果> 9
我们应该拆分。因此,如果我们分成2个文件[Col1, Col2, Col3]
和[Col4]
,则不满足条件,因为第一行文件将在第二行包含3 + 3 + 5 > 9
,在第三行包含4 + 7 + 2 > 9
。如果我们拆分为[Col1, Col2]
和[Col3, Col4]
,则无法满足条件,因为第一个文件将在第三行中包含4 + 7 > 9
。因此,我们将其拆分为3个文件,例如[Col1]
,[Col2, Col3]
和[Col4]
。现在每个文件都是正确的,看起来像:
File1 | File2 | File3
------------------------------
Col1 | Col2 Col3 | Col4
2 | 2 2 | 2
3 | 3 5 | 3
4 | 7 2 | 1
...............................
因此它应该从左到右分割,为左侧文件提供尽可能多的列。问题是这个文件可能很大,我不想把它读入内存,因此我们逐行读取初始文件,不知怎的,我应该确定要拆分的一组索引。如果可以的话呢?我希望我能很好地描述这个问题,所以你可以理解它。
答案 0 :(得分:0)
通常awk非常擅长处理大型csv文件。
您可以尝试this之类的内容来检索每列的最大长度,然后决定如何拆分。
让我们说file.txt包含
Col1;Col2;Col3;Col4
aa;aa;aa;aa
aaa;aaa;aaaaa;aaa
aaaa;aaaaaaa;aa;a
(假设Windows样式引号)运行以下内容:
> awk -F";" "NR>1{for (i=1; i<=NF; i++) max[i]=(length($i)>max[i]?length($i):max[i])} END {for (i=1; i<=NF; i++) printf \"%d%s\", max[i], (i==NF?RS:FS)}" file.txt
将输出:
4;7;5;3
你能在真实的数据集上试试这个吗?