はじめに

MacのExcelで、CSVとして保存した際に、

各行にダブルクォーテーションをつける簡単な方法が見つけられませんでした。

数千行ぐらいならば、テキストエディタの機能でも対応できたのですが、

数万行にもなると、テキストエディタが落ちてしまったため、

シェルスクリプトを作成しました。

環境

・macOS Big Sur バージョン 11.2.3

・Bash version 3.2.57

結果

使い方は、下記のコードをaddDoubleQuotation.shという名前で保存したなら、

Macのターミナル.appから、下記のコマンドで実行してください。

addDoubleQuotation.shも対象のファイルもパスには気をつけてください。

実行すると、元ファイルと同じディレクトリに”output_対象のcsvファイル名”で、ファイルが生成されます。

sh addDoubleQuotation.sh 対象のCSVファイル名

addDoubleQuotation.sh

#!/bin/bash
echo 'Start'

INPUT_FILE=$1
echo "INPUT_FILE: ${INPUT_FILE}"

INPUT_FILE_DIR=$(dirname ${INPUT_FILE})
INPUT_FILE_NAME=$(basename ${INPUT_FILE})
TMP_FILE="${INPUT_FILE_DIR}/tmp_${INPUT_FILE_NAME}"
OUTPUT_FILE="${INPUT_FILE_DIR}/output_${INPUT_FILE_NAME}"

echo "OUTPUT_FILE: ${OUTPUT_FILE}"

#処理開始
cat ${INPUT_FILE} > ${TMP_FILE}

#CRLFの場合は、LFに変換する
grep -q 'r$' ${TMP_FILE}
if [ $? -eq 0 ] ; then
  echo 'This file is CRLF'
  sed 's/r//g' ${INPUT_FILE} > ${TMP_FILE}
fi

#囲み文字を追加する処理を開始
cat ${TMP_FILE} | while read line || [ -n "${line}" ]
do
  echo ""${line}"" >> ${OUTPUT_FILE}
done

#CRLFの場合は、CRLFにもどす
grep -q 'r$' ${TMP_FILE}
if [ $? -eq 0 ] ; then
  sed 's/$/r/g' --in-place ${OUTPUT_FILE}
fi

#中間ファイル削除
rm ${TMP_FILE}

echo 'End'

仕様

MacでテキストエディタなどでCSVとして保存すると、改行コードはLFになるかと思いますが、

Excelで保存したCSVに対応するため、改行コードがCRLFでも動作するようになっています。

また、最終行の末尾に改行がなかった場合は、自動的に追加されるようになっています。

コードについて

元のCSVファイル(INPUT_FILE)に上書きしたくなかったため、

元のCSVファイル(INPUT_FILE)を、一度中間ファイル(TMP_FILE)に出力してから、

囲み文字をつける処理をしています。