【问题标题】:Split columns that are seperated with tabs and spaces拆分用制表符和空格分隔的列
【发布时间】: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 更好地处理该文本。

标签: csv awk


【解决方案1】:

使用 GNU awk 进行 FPAT:

$ cat tst.awk
BEGIN { FPAT="\\S+|\"[^\"]+\"|,[^,]+," }
{
    gsub(/@/,"@A")
    gsub(/,/,"@B")
    gsub(/""/,",")
    for (i=1; i<=NF; i++) {
        gsub(/,/,"\"\"",$i)
        gsub(/@B/,",",$i)
        gsub(/@A/,"@",$i)
        print i, $i
    }
}

$ awk -f tst.awk file
1 0
2 "some string"
3 234
4 23947
5 123
6 ""some escaped"string""

要了解它的作用,请参阅https://stackoverflow.com/a/40512703/1745001

【讨论】:

  • 很高兴有人发布了一个 Q 用一个相当极端的案例来测试和证明你的模型 ;-)
猜你喜欢
  • 2017-08-11
  • 2022-12-26
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2011-06-07
相关资源
最近更新 更多