将固定长度的逐行文本文件转换为 SQL 并转置
Posted
技术标签:
【中文标题】将固定长度的逐行文本文件转换为 SQL 并转置【英文标题】:Convert a fixed-length line by line text file into SQL and transpose 【发布时间】:2016-08-16 11:55:16 【问题描述】:我有一个非常大的数据文本文件 (3gb),格式为:
NEW
2016-08-15_20-45-47-3120
0
0
0
0
1960
0
0
每个新数据条目都以“NEW”开头,然后是日期戳和 456 个数字。
我想把它转换成如下格式:
New 2016-08-15_20-45-47-3120 0 190 0 300
New 2016-08-15_20-45-47-3140 0 0 0 0
New 2016-08-15_20-45-47-3620 1 34 4 76
我通常会先在 excel 中抵消它,但对于如此大的数据集,它无法开始处理,所以必须在 SQL 中完成。
谢谢
【问题讨论】:
这类任务可以通过写一些c#实用程序来高效处理。格式一次,就可以使用批量导入 所需记录的结构是否固定?换句话说,您是否希望new
之后的输入记录数为5?
另外,你的操作系统是什么?
【参考方案1】:
这就是我觉得 awk 有用的东西。
此脚本将它看到的每一行捕获到一个数组中,每次它看到包含 NEW 的行(或文件结尾)时都会输出并重置该数组。如果将此代码保存到transpose.awk
,则可以使用awk -f transpose.awk big.txt > out.txt
运行。
function output(a,n, i)
if(n > 0)
for(i = 0; i < n; i++)
printf "%s\t", a[i];
printf "\n";
/^NEW/ output(a,n); n=0; delete a;
a[n++] = $0;
END output(a,n);
如果您只想输出前 5 列而不是全部 8 列,您可以更改 for
循环以提前停止。
我用一个 224M 的虚拟样本文件对此进行了测试,在我的计算机上用了 44 秒,所以 3GB 大约需要 10 分钟。不快,但可以忍受。
【讨论】:
以上是关于将固定长度的逐行文本文件转换为 SQL 并转置的主要内容,如果未能解决你的问题,请参考以下文章