さまざまな長さの5つの列を持つcsvファイルがあります。列間の区切り記号はで","
、最後の列はで終わります"
。行区切り記号は改行文字です。最新のファイルには改行があるため、最後の列のテキストにそれを保持する必要があります。
各行末の改行をレコード区切り文字として使用してこのファイルをインポートしましたが、テキストの最後の列の改行が原因でインポートプログラムでエラーが発生しました。改行文字がフィールドの1つにあることを認識するのは十分スマートではありません。したがって、正しくインポートするには、新しい行末区切り文字を作成し、シェルコマンドを使用して各行末に挿入する必要があります。完了しました。
一般的に使用されるコマンドにはGNU機能がないため、さらに難しいです。私はAIXでkornshellを使用しています。他のソフトウェアをインストールできません。
例:
"id1","column2 with text","3","4/4/2044","the
column
that messes everything up"
"id2",""column2 with text","42","9/9/2099","oh no,
not
again
!!"
シェルコマンド(awk、sed、perl、trなど)と| @ |を区切り文字として使用して、上記の例では、行1が次のように終了するように、各行の末尾に新しい区切り文字を挿入するにはどうすればよいですか。
that messes everything up"|@|
2行目は次に終わります。
!!"|@|
各行の末尾から改行文字を削除する必要はありません。インポートツールは、行末の区切り文字の一部ではない場合は無視します。
答え1
"
すべてのレコードがaの後に改行文字で終わり、aの後"
に改行が続く唯一の時間がレコードの終わりであると安全に仮定できる場合、これは比較的簡単です。
$ sed 's/(.*")$/\1|@|/' file
"id1","column2 with text","3","4/4/2044","the
column
that messes everything up"|@|
"id2",""column2 with text","42","9/9/2099","oh no,
not
again
!!"|@|
または、次の後にスペースを入れてください"
。
sed 's/"[[:blank:]]*$/"|@|/' file
もちろん、これは堅牢ではありません。 CSVファイルで許可されているため、フィールドに二重引用符を使用する可能性が高くなります。つまり、フィールドと改行の前に二重引用符を使用できます。これが発生すると、私の単純なアプローチは失敗し、実際には適切なパーサーを作成するか、適切なcsvパーサーを持つperlやpythonなどのツールを使用する必要があります。