我需要读取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的第二行不是计数?
答案 0 :(得分:0)
如果只使用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
提供多个参数,每个;
- 分隔的字段将分配给其对应的变量。 1到$f1
,第2到$f2
,其余到$f3
。
如果您需要将这些值存储为变量,请说:source <( command )
。
答案 1 :(得分:0)
您可以设置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