gpt4 book ai didi

bash - 如果只有非空字段用双引号引起来,如何读取 CSV 文件?

转载 作者:行者123 更新时间:2023-11-29 09:39:51 25 4
gpt4 key购买 nike

我正在尝试在 Bash 脚本中读取 CSV 文件。我使用 gawk 并指定 FPAT 成功实现了这一点:

gawk -v LOGFILE="${LOGFILE}" 'BEGIN {
FPAT = "([^,]+)|(\"[^\"]+\")"
}
NR == 1{
# doing some logic with header
}
NR >= 2{
# doing some logic with fields
}' <filename>

这里的问题是,该文件包含如下数据:

"RAM","31st street, Bengaluru, India",,,,"7865431234",,"VALID"

现在,有了这些数据,我得到了错误的数据,因为它忽略了逗号,这给我错误的提取数据位置编号。例如,它告诉“7865431234”出现在第 3 个位置,而它在第 6 个位置。

任何人都可以建议更改以获得字段的正确位置吗?

最佳答案

您的 FPAT 要求每个字段至少包含一个字符,但您想要识别具有零个字符的空字段。为 FPAT 添加一个允许零个字符的替代方法:

gawk 'BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")|" }
{ printf "%d:%d:", NR, NF; for (i = 1; i <= NF; i++) printf("[%s]", $i); print "" }'

注意 FPAT 末尾的额外 |。该操作仅标识记录号、字段数,并用方括号将每个字段的值括起来。

当您的数据字符串提供给该脚本时,输出为:

1:8:["RAM"]["31st street, Bengaluru, India"][][][]["7865431234"][]["VALID"]

这四个空字段非常清楚。

现在你所要做的就是处理:

"Mr ""Manipulator"", the Artisan","29th Street, Delhi, India",,,"",,,"INVALID"

引号内有双引号。这并不难管理:

gawk 'BEGIN { FPAT = "([^,]+)|(\"([^\"]|\"\")*\")[^,]*|" }
{ printf "%d:%d:", NR, NF; for (i = 1; i <= NF; i++) printf("%d[%s]", i, $i); print "" }' "$@"

FPAT 表示一个字段是:

  • 一系列非逗号,

  • 或者它是以双引号开头的字段,包含零个或多个以下任一实例:

    • 一个非引用,或者
    • 两个双引号

    后跟双引号和可选的非逗号数据

  • 否则为空

请注意,'optional non-comma data' 应该为空,并且只出现在格式错误的 CSV 数据中。

给定输入数据:

"RAM","31st street, Bengaluru, India",,,,"7865431234",,"VALID"
"Mr ""Manipulator"", the Artisan","29th Street, Delhi, India",,,,,,"INVALID"
"Some","","Empty","",Fields "" Wrapped,"",in quotes
"Malformed" CSV,Data,"Note it has data after" a close quote,"and before a comma,",,"INVALID"

这会产生:

1:8:1["RAM"]2["31st street, Bengaluru, India"]3[]4[]5[]6["7865431234"]7[]8["VALID"]
2:8:1["Mr ""Manipulator"", the Artisan"]2["29th Street, Delhi, India"]3[]4[]5[]6[]7[]8["INVALID"]
3:7:1["Some"]2[""]3["Empty"]4[""]5[Fields "" Wrapped]6[""]7[in quotes]
4:6:1["Malformed" CSV]2[Data]3["Note it has data after" a close quote]4["and before a comma,"]5[]6["INVALID"]

请注意,字段编号作为前缀包含在括号内的数据中(因此我稍微调整了打印格式)。

唯一无法处理的格式是可以将换行符嵌入到字段数据中的格式——根据基于行的输入的性质,它假定没有字段被拆分为多行。 (这也意味着它无法正确识别以双引号开头并且在行尾之前没有匹配的双引号的字段。我想你可以添加一个替代方案来识别它。它会更好使数据正确。)


注意 Sobrique 中的建议的 answer使用设计用于处理 CSV 的工具来处理 CSV。这通常是一个好主意,您必须处理的变体集越复杂,这个主意就越好。这接近于您应该考虑使用的复杂正则表达式。另请注意,尽管 RFC 4180正式和严格地定义了一个 CSV 版本,有多个程序(包括 MS Office)处理不同但相关的格式。

关于bash - 如果只有非空字段用双引号引起来,如何读取 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35507866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com