【发布时间】:2014-08-10 00:19:30
【问题描述】:
我有两个大的 CSV 文件(大约 1GB)。他们都共享彼此之间的关系(ID就像外键一样)。结构简单,逐行但可以出现值字符串中带有换行符的CSV单元格
37373;"SOMETXT-CRCF 或其他换行符-";3838383;"sasa ssss"
一个文件是P文件,另一个是T文件。 T 相当于 P 文件的 70% 大小(P > T)。我必须将它们切割成更小的部分,因为它们对于我必须导入它们的程序来说太大了......我不能简单地使用split -l 100000,因为我将失去必须保留的 ID=ID 关系!关系可以是 1:1、2:3、4:6 或 1:5。所以愚蠢的文件分割是没有选择的,我们必须检查我们创建新文件的地方。这是一个简化 CSV 结构的示例,也是我希望剪切文件的地方(上面的行转到单独的 P|T__00x 文件,我们继续直到 P 或 T 结束)。行在两个文件中都进行了排序,因此无需在整个文件中搜索 ID!
文件“P”(为清晰起见空行):
CSV_FILE_P;HEADER;GOES;HERE
564788402;1;1;"^";"01"
564788402;2;1;"^";"01"
564788402;3;1;"^";"01"
575438286;1;1;"^";"01"
575438286;1;1;"^";"01"
575438286;2;1;"37145859"
575438286;2;1;"37145859"
575438286;3;1;"37145859"
575438286;3;1;"37145859"
575439636;1;1;"^"
575439636;1;1;"^"
# lets say ~100k line limit of file P is somewhere here and no more 575439636 ID lines , so we cut.
575440718;1;1;"^"
575440718;1;1;"^"
575440718;2;1;"10943890"
575440718;2;1;"10943890"
575440718;3;1;"10943890"
575440718;3;1;"10943890"
575441229;1;1;"^";"01"
575441229;1;1;"^";"01"
575441229;2;1;"4146986"
575441229;2;1;"4146986"
575441229;3;1;"4146986"
575441229;3;1;"4146986"
文件 T(为清晰起见空行)
CSV_FILE_T;HEADER;GOES;HERE
564788402;4030000;1;"0204"
575438286;6102000;1;"0408"
575438286;6102000;0;"0408"
575439636;7044010;1;"0408"
575439636;7044010;0;"0408"
# we must cut here since bigger file "P" 100k limit has been reached
# and we end here because 575439636 ID lines are over.
575440718;6063000;1;"0408"
575440718;6063000;0;"0408"
575441229;8001001;0;"0408"
575441229;8001001;1;"0408"
您能否帮助将这两个文件拆分为许多 100 000(左右)行,单独的文件 T_001 和相应的 P_001 文件等等?所以文件部分之间的 ID 匹配。我相信 awk 将是最好的工具,但我在这个领域没有太多经验。最后一件事 - CSV 标头应该保留在每个文件中。 我有强大的 AIX 机器来解决这个问题(linux 也可以,因为 AIX 命令有时是有限的)
【问题讨论】:
-
为什么功能强大的 AIX 机器会因此而遭到破坏? CSV 显然不是解决方案的正确数据格式。使用数据库
-
是的,但我不是创建、导入、使用 JOIN 然后再次导出数据库解决方案的数据库管理员。我需要 awk、tail、head 或其他工具解决方案。需要从 CSV 文件导入这些较小文件的程序,这是我的目标 - 获得许多 100 000 行文件并保留关系。
-
man... 我在一家大型 IT 公司工作,我不能自己创建和管理数据库。 DB家伙正在休假,明天必须完成工作。所以 stackoverflow 社区是我最后的希望。
-
把空行去掉有关系吗?
-
我们根本不需要then(空行是为了让你第一眼看到关系,我已经输入了)。我们可能在不同的 CSV“单元格”处有一个 CRLF(或其他)换行符,因此在引号之间 - 这有时会在 CSV 中产生一个新的空行......但到目前为止,我只发现一个地方有这样的“坏数据” ”(因为这个文件是一个人名 - 在我们国家的名字中没有白色字符:) ...)。我可以删除这个问题手册。