IFS无法很好地解析CSV

如何解决IFS无法很好地解析CSV

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

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,2,0
    ALT CAMP,01,30/07/2020,Dona,Entre 15 i 64,Si,Entre 65 i 74,1,0

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

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

我不了解这种行为,并且它似乎比打印第一列还要有用。例如,如果我要放置c和$ c,它将不会显示第三列,依此类推。

您能解释一下这种现象以及为什么发生吗?

谢谢

解决方法

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

,

bash不是解析csv文件的正确工具,为此您应该考虑awk。例如要打印前两列,请使用以下超级简单的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
,

对于简单 CSV文件,您可以简单地在每个逗号上进行拆分,但是除非您知道每个字段中的列数,否则您希望将输入读取为 array 行。

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

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

但是,在bash中,将整个拆分行读取为单个 array 更为简单:

while IFS=,read -ra f; do

第一个字段为"${f[0]}",第二个字段为"${f[1]}",依此类推。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?