【问题标题】:Save CSV values into variables in shell将 CSV 值保存到 shell 中的变量中
【发布时间】:2015-10-07 02:47:36
【问题描述】:

我需要读取 CSV 文件的每一行并将值保存到变量中。

我的多行 CSV 文件示例:

 value1;value2;value3
 value4;value5;value6

我有这个:

 for enreg in `cat ../files/inputs/file.csv`
   do
     INFO1= `echo $enreg | awk -F ';' '{ print $1}'`
     INFO2= `echo $enreg | awk -F ';' '{ print $2}'`
     INFO3= `echo $enreg | awk -F ';' '{ print $2}'`
     echo "INFO1= $INFO1"
     echo "INFO2= $INFO2"
     echo "INFO3= $INFO3"
     echo "$INFO3;$INFO2;$INFO1" >> ../files/output/files.csv
  done

我在控制台中有以下结果:

 INFO1= value1
 value4
 INFO2= value2
 value5
 INFO3= value3
 value6

但我需要将其写入第二个 CSV 文件:

 INFO1= value1
 INFO2= value2
 INFO3= value3
 INFO1= value4
 INFO2= value5
 INFO3= value6

感谢您的帮助,祝您有美好的一天。

_______________________________________________________________________________

更新

我的 CSVmatricule.csv 是:

value1;value2;value3 
value4;value5;value6 

我的 CSVmatricule.ks 是:

while IFS=";" read -r f1 f2 f3 
  do 
    echo "INFO1=$f1" 
    echo "INFO2=$f2" 
    echo "INFO3=$f3"
  done < ../files/inputs/CSVmatricule.csv 

我的控制台结果:

INFO1=value1 
INFO2=value2 
INFO3=value3

cat -vet ../files/inputs/CSVmatricule.csv 的结果:

value1;value2;value3$
value4;value5;value6

为什么 CSV 的第二行没有计数??

【问题讨论】:

  • I need to read each lines of a CSV file and save values into variables. - 这是极不可能的。更有可能这是 XY 问题的一个示例,请参阅 meta.stackexchange.com/a/66378。如果您告诉我们您正在尝试做什么,我们可以告诉您如何解决您的问题,而不是告诉您如何实施这个几乎可以肯定是错误的尝试解决您的问题的方法。

标签: shell csv awk sh


【解决方案1】:

为此使用awk 命令怎么样?

$ awk -F";" '{for (i=1;i<=NF;i++) printf "INFO%d=%s\n", i, $i}' file
INFO1=value1
INFO2=value2
INFO3=value3
INFO1=value4
INFO2=value5
INFO3=value6

这将遍历;-分隔的字段并将它们与INFO + 数字一起打印。

如果字段数固定,也可以使用while循环:

while IFS=";" read -r f1 f2 f3
do
  echo "INFO1=$f1"
  echo "INFO2=$f2"
  echo "INFO3=$f3"
done < file

这是顺序循环文件的方式,而不是您的for ... in cat ...。这样,while 中的每个循环都会读取一行。此外,通过给read 提供多个参数,每个; 分隔的字段都分配给其对应的变量。第一个到$f1,第二个到$f2,其余的到$f3


如果您需要将这些值存储为变量,只需说:source &lt;( command )

【讨论】:

  • 您好,fedorqui 和您的回复。第一个解决方案完美运行,但使用第二个解决方案,结果是 INFO1=value1 INFO2=value2 INFO3=value3 但它不适用于第二行。
  • @Florian_L 它对我有用:如果你说while IFS=";" read f1 f2 f3; do echo "INFO1=$f1"; echo "INFO2=$f2"; echo "INFO3=$f3"; done &lt; file,你会得到什么?
  • 我得到:INFO1=value1 INFO2=value2 INFO3=value3
  • @Florian_L 我不能说更多。也许您的文件包含奇怪的字符?请与cat -vet file 联系。使用您显示的文件,它对我有用。
  • @Florian_L “它不适用于第二行”是什么意思?您的意思是写入 output/files.csv ?
【解决方案2】:

您可以设置IFS 变量,以便read 命令在';'上拆分:

export IFS=";"
cat ../files/inputs/file.csv | while read INFO1 INFO2 INFO3
 do
   echo "INFO1= $INFO1"
   echo "INFO2= $INFO2"
   echo "INFO3= $INFO3"
   echo "$INFO3;$INFO2;$INFO1" >> ../files/output/files.csv
done

【讨论】:

  • 这正是我的解决方案正在做的,说while IFS=";" ...
  • 感谢您的回复 robert 但与 fedorqui 解决方案相同,只是 INFO1=value1 INFO2=value2 INFO3=value3 打印在控制台上。
猜你喜欢
  • 2011-10-21
  • 2022-06-15
  • 1970-01-01
  • 2019-12-25
  • 2021-11-19
  • 2014-11-22
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多