【问题标题】:Loop through CSV file and create new csv file with while read?循环遍历 CSV 文件并在读取时创建新的 csv 文件?
【发布时间】:2021-08-15 05:47:25
【问题描述】:

我有

while read $field1 $field2 $field3 $field4
do
  $trimmed=$field2 | sed 's/ *$//g'
  echo "$trimmed","$field3" >> new.csv
done < "$FEEDS"/"$DLFILE"

现在问题出在read 我不能让它拆分字段 csv 样式,可以吗?请参阅下面的输入 csv 格式。

我需要取出第 3 列和第 4 列,从第 2 列去除填充,并且我不需要引号。

带有列号的 CSV 格式: 12 24(")25(,)26(")/27(Field2values) 42(")/43(,)/44(Field3十进制值) "Field1_constant_value","Field2values",Field3,Field4

Field1 是恒定的且无关紧要。引用数据,从引号内的 2-23 开始。 Field2 固定在第 27-41 列的引号内,数据在左边,右边用空格填充。 Field3 是一个十进制数,小数点前有 1,2 或 3 位,后有 2 位,无填充。从第 74 列开始。 Field4 是一个日期,我现在不太关心它。

【问题讨论】:

    标签: bash text csv pattern-matching


    【解决方案1】:

    是的,您可以使用 read;您所要做的就是重置环境变量 IFS -- 内部字段分隔符 --,这样它就不会按当前值(默认为空格)分割行,而是按您自己的分隔符。

    考虑具有给定内容的输入文件“a.csv”:

    1,2,3,4

    2,3,4,5

    6,3,2,1

    你可以这样做:

    IFS=','
    while read f1 f2 f3 f4; do
        echo "fields[$f1 $f2 $f3 $f4]"
    done < a.csv
    

    输出是:

    字段[1 2 3 4]

    字段[2 3 4 5]

    字段[6 3 2 1]

    【讨论】:

    • while IFS=, read f1 f2 f3 f4; do ... 将避免为整个脚本设置IFS
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2016-10-30
      • 2019-09-29
      • 2017-10-02
      • 2019-04-11
      • 2019-07-21
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多