【问题标题】:IFS not parsing well CSVIFS 不能很好地解析 CSV
【发布时间】:2020-10-18 15:01:42
【问题描述】:

我正在尝试解析一个文件,以便获得第一列。我正在使用的命令是:

while IFS=',' read -r a; do echo "$a"; done < test.csv

但是它仍然输出整个 csv 而不是第一列。 csv的一个例子如下:

NOM,CODI,DATA,SEXE,GRUP_EDAT,RESIDENCIA,CASOS_CONFIRMAT,PCR,INGRESSOS_TOTAL,INGRESSOS_CRITIC,INGRESSATS_TOTAL,INGRESSATS_CRITIC,EXITUS
    MOIANÃS,42,24/08/2020,Home,Majors de 74,No,0,2,0,0,0,0,0
    ALT CAMP,01,30/07/2020,Dona,Entre 15 i 64,Si,0,0,0,0,0,0,0
    ALT CAMP,01,30/07/2020,Dona,Entre 65 i 74,No,0,1,0,0,0,0,0
    ALT CAMP,01,30/07/2020,Dona,Entre 65 i 74,Si,0,0,0,0,0,0,0

我一直在寻找其他地方,似乎所有人都同意这应该是使用 IFS 解析 csv 时的正确方法。我注意到的一件事是,如果我向 read 函数添加一个新列,比如 b,它会输出第一列而不是所有内容。

while IFS=',' read -r a b; do echo "$a"; done < test.csv

我不理解这种行为,而且它似乎没有比打印第一列更有效。例如,如果我将 c 和 $c 放在一起,它就不会打印第三列等等。

您能否解释一下这种行为以及为什么会发生这种情况?

谢谢

【问题讨论】:

  • 您应该阅读read 命令的说明。 linuxcommand.org/lc3_man_pages/readh.html
  • 如果您的数据已被 MS-Windows 机器访问,请与 cat -vet file | head -10 联系。如果您在每行末尾看到^M$,则使用dos2unix file 将您的文件转换为*nix 格式。祝你好运。

标签: bash ifs


【解决方案1】:

read 工作正常。它在 IFS 上拆分并将每个字段分配给一个变量,该行的其余部分转到最后一个变量。如果你只给一个变量,整行都到它。

【讨论】:

  • 我认为情况并非如此。如果它输入while IFS=',' read -r a b; do echo "$a $b"; done &lt; test.csv,它不会输出前两列。你能详细说明一下吗?
  • @js352 它在 IFS 上拆分并将每个字段分配给一个变量 [第一个字段到 $a],该行的其余部分转到最后一个变量 [$b]。 在你的while 中尝试echo $aecho $b
【解决方案2】:

bash 不是解析 csv 文件的正确工具,您应该考虑使用 awk。例如打印前 2 列使用这个超级简单的 awk 命令:

awk -F, '{print $1, $2}' file.csv

只是为了突出您的问题:关于您的 bash 循环,最好使用数组将所有逗号分隔的列准备好:

while IFS=, read -ra arr; do
    # print first 2 columns
    echo "col1=${arr[0]}, col2=${arr[1]}"
done < file.csv

【讨论】:

    【解决方案3】:

    对于 simple CSV 文件,您可以简单地在每个逗号上拆分,但您希望将输入读入一个 array,除非您知道每个逗号的列数行。

    例如,如果您知道(最多)10 列,您可以使用

    while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10; do
    

    然而,在bash 中,将整个分割线读入单个数组 更简单:

    while IFS=, read -ra f; do
    

    第一个字段是"${f[0]}",第二个字段是"${f[1]}",等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-19
      • 2013-01-22
      • 2013-07-28
      • 2021-07-23
      • 2018-01-11
      • 2015-08-03
      • 2011-12-24
      • 2015-08-25
      相关资源
      最近更新 更多