将固定长度的逐行文本文件转换为 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 并转置的主要内容,如果未能解决你的问题,请参考以下文章

将固定宽度的文件从文本转换为 csv

将另一个表中的逐行值转换为字符串并将其插入到 SQL 中的 NOT IN 子句中

如何将excel的数据输出到文本文件中并设定长

来自谷歌云视觉 API OCR 的逐行数据

AS3:如何将数据网格中的数据保存到逐行文本文件中?

如何在 JSF 数据表中应用换行文本样式?