【发布时间】:2016-11-11 10:17:25
【问题描述】:
我这里有一个非常奇怪的文件格式,它使用任意数量的制表符和空格来分隔字段(甚至是尾随和前导字段)。另一个特点是,可以在字段中添加空格,然后以 CSV 方式转义。
一个例子:
0 "some string" 234 23947 123 ""some escaped"string""
我尝试用 awk 解析这些列,我需要将每个项目都放在一个数组中,例如
foo[0] -> 0
foo[1] -> "some string"
foo[2] -> 234
foo[3] -> 23947
foo[4] -> 123
foo[5] -> ""some escaped"string""
这甚至可能吗?我读过http://web.archive.org/web/20120531065332/http://backreference.org/2010/04/17/csv-parsing-with-awk/,它说解析 csv 已经非常困难了(一开始它应该足以解析带有空格的普通字符串,转义的变体非常罕见)
在我搞砸了很长时间之前:有没有办法在 awk 中做到这一点,或者我最好使用其他语言?
【问题讨论】:
-
您最好花时间从生产者系统中获得格式正确的输出;-/(是的,CSV 和 unix 工具有不同的哲学基础。)祝您好运。
-
@shellter haha :D 这可能不会发生......这些文件是由一些只在 Windows 上运行的软件生成的,有一些半书面的文档,我尝试将它们转换成某种可读的格式。 .. :/ 开发者已经说过他不会支持除自己的任何软件,所以唯一的办法是我自己转换文件。我想知道他如何阅读他的产品中的文件
-
快速浏览后我会说解决方案应该是有状态的,或者如果需要使用 Awk 不支持的正则表达式前瞻。我应该说 awk 真的很难做到,有人会在 15 分钟内编写代码......
-
有许多可接受的 CSV 格式,但没有您发布的内容符合的 CSV 格式。用 awk 解析 CSV 很容易,但您的文件不是 CSV,它们只是使用引号引起的混乱(例如,
"..."是一个字段,所以""将是一个空字段,但""也是开始和如果该字段包含")。你确定你不只是复制/粘贴不正确吗?没有其他工具/语言可以比 awk 更好地处理该文本。