csvの行を繰り返して、列を変数として保存します。

csvの行を繰り返して、列を変数として保存します。

次のCSVがあります。

Column1,Column2,Column3
A Existing text in Column1, A Date in Column2, A Integer in Column3
B Existing text in Column1, B Date in Column2, B Integer in Column3
C Existing text in Column1, C Date in Column2, C Integer in Column3

ファイルを繰り返すときは、forループを使用して各行を変数として保存しようとしています。

for i in `cat file.csv`
    do
        VARIABLE=$(echo $i && echo ", Another text")
    done

変数を次のように保存する代わりに(たとえば、最初の反復でVARIABLE): A Existing text in Column1, A Date in Column2, A Integer in Column3, Another text

次のように保存されます。

Column1,Column2,Column3
 , Another Text
A
 , Another Text
Existing
 , Another Text
text
 , Another Text
in
 , Another Text
Column1,
 , Another Text
A
 , Another Text
Date
 , Another Text
in
 , Another Text
Column2,
 , Another Text
A
 , Another Text
Integer
 , Another Text
in
 , Another Text
Column3
 , Another Text
B
 , Another Text
Existing
 , Another Text
text
 , Another Text
...(continues)

forライン全体を全体的に見るよりも、各タスクを循環する特別な理由はありますか?

答え1

問題は設定です$IFS

echo -n "$IFS" | od -t c -t x1
0000000      \t  \n
         20  09  0a

の出力は、catすべてのスペース、タブ、または改行文字で分割されます。改行文字でのみ分割したいです。だからこれはうまくいきます:

IFS='
'
for i in `cat file.csv`
    do
        VARIABLE=$(echo $i && echo ", Another text")
    done

しかし、これは良いアプローチではありません。行を読む必要があります。また、コマンドの置換やecho変数の組み合わせも使用しないでください。

while IFS= read -r line; do
    VARIABLE="${line}, Another text"
done <file.csv

答え2

CSVに他の列を効率的に追加するには、CSVと連携するツールを試してください。

GoCSV~の次へ追加このコマンドを使用すると、これを簡単に実行できます。

gocsv add -n 'Column4' -t ' Another text' sample.csv

私にしてください:

Column1,Column2,Column3,Column4
A Existing text in Column1," A Date in Column2"," A Integer in Column3"," Another text"
B Existing text in Column1," B Date in Column2"," B Integer in Column3"," Another text"
C Existing text in Column1," C Date in Column2"," C Integer in Column3"," Another text"

実際のCSVファイルとして処理したくない場合(前のスペースのためにすべての二重引用符が必要です)、次のことを試すことができます。

sed 's/.$/, Another text/' sample.csv
Column1,Column2,Column3, Another text
A Existing text in Column1, A Date in Column2, A Integer in Column3, Another text
B Existing text in Column1, B Date in Column2, B Integer in Column3, Another text
C Existing text in Column1, C Date in Column2, C Integer in Column3, Another text

しかし!、ファイルに末尾/末尾の改行がある場合にのみ機能します。それ以外の場合は、最後の文字(最後の列、最後の行)が削除されます。

関連情報