【问题标题】:Messed up records - separator inside field content记录混乱 - 字段内容内的分隔符
【发布时间】:2012-09-23 14:36:39
【问题描述】:

我收到了包含我需要加载到 postgres 数据库中的数据的文本文件。

文件结构为记录(每行一个),字段由波浪号 (~) 分隔。不幸的是,有时字段内容会包含一个波浪号。

由于文件不是整齐的 CSV,并且波浪号没有转义,这会导致记录包含的字段过多,从而导致数据库抛出异常并停止加载。

我知道记录应该是什么样子(文本、整数、浮点字段)。

有人对如何修复超长记录有建议吗?我用 per 编码,但我对 python、javascript、纯英语的建议感到满意。

【问题讨论】:

  • 你能举个例子吗?
  • Perl 的Text::CSV 模块或Python 的csv 模块呢?
  • 文本字段是否被引用?例如。像这样:"foo"~123~1.25
  • 你可以做一些简单的事情,比如:perl -F'~' -lane 'print if @F > 10' input.txt > broken_fields.txt 其中“10”是允许的最大字段数。然后,您可以在闲暇时检查破碎的田野。

标签: python perl language-agnostic


【解决方案1】:

您可以尝试使用以下内容过滤掉损坏的行:

perl -F'~' -lane 'print if @F > 10' input.txt > broken_fields.txt 

(假设您的最大字段数为 10)。它会给你一个简短的(er)文件,其中包含你可以手动检查的可疑行。这不是一个万无一失的过滤器,它会例如打印出允许的字段,例如带引号的字符串中的波浪线。如果您想要更准确的信息,您可以使用Text::CSV,但是当涉及到损坏的 csv 数据时,这会带来其他困难。

可能有更好的(和自动的)方法来解决这个问题,但是在不知道您的输入是什么样子的情况下,没有办法真正推荐一些东西。

【讨论】:

  • 我按照你的建议做了。这使我确定了罪魁祸首的两个字段(数据库中被转储的文本字段)。由于我有两个必须包含某些字符串的其他字段,我现在可以修复字符串,直到这两个字段检查正则表达式。非常感谢。
【解决方案2】:

如果您知道每个字段应该是什么,也许您可​​以编写一个仅匹配该字段类型的正则表达式(忽略波浪号)并捕获匹配项,然后替换文件中的原始字符串?

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 2019-04-17
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多