私はcygwinを使ってRAM(512M)が限られたコンパクトな仮想マシンに接続しています。
また、4 GBのcsvファイルからsqlite3データベースにインポートしようとしていますが、2行(合計8.717.201行)を除いてインポートに関する手がかりはありません。
行2にcontrol-m文字(^ M)があるようで、csv形式が壊れてインポートに失敗します。
control-m charを使用しようとすると、sed 's|,^M|,|' file.csv
テキストASCII(2文字)が作成されるため、代替項目は検索されません。
これを行うためにテストファイルを使用し、検索と置換のために開くと、コードで書かれていますvi
(青い^ Mと単一文字として機能します)。
CSVファイルを修復する方法? (またはcygwinでcontrol-mシーケンスをどのように書き換えますか?
問題のある行の例:
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3^M$
,keyword4$
keyword5,keyword1,keyword2$
どうすればいいですか:
$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3,keyword4$
keyword5,keyword1,keyword2$
PS:ご覧のとおり、英語は私の母国語ではありませんでした。
答え1
実際、キャリッジリターンは間違った改行を識別するのに役立ちます。
s '/^M$/{N;s/^M\n//;}' test
Steeldriverが書いたように^M
一般的ctrlVにctrlM。
コマンドの意味
/^M$/{...}
:行末に改ページがある行で中括弧で囲まれたコマンドを実行します。N
ext はバッファに次の行を追加し、行間に改行文字を挿入します。s/^M\n//
s
キャリッジリターン+改行文字を何もないものに置き換え(改行文字削除)
この単純なスクリプトは、行が最大1回中断されると仮定します。それ以外の場合は、次のものが必要です。
sed 'H;1h;$!d;x;s/^M\n//g' file
答え2
置換のためにsedまたはviから改行(またはEnter)表現を取得する1つの方法^M
は、次のように入力することです。
ctrlV enter