【问题标题】:Convert a fixed-length line by line text file into SQL and transpose将固定长度的逐行文本文件转换为 SQL 并转置
【发布时间】: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?
  • 另外,你的操作系统是什么?

标签: sql database tsql ssms sql-server-express


【解决方案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 分钟。不快,但可以忍受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2017-12-17
    相关资源
    最近更新 更多