LINUX環境からCSVデータを取得した場合、CRLFとLFが混在しているCSVが作成される場合があります。
windowsでデータを作成した場合、改行コードは「CRLF(\r\n)」に統一されてる場合が殆どですが、
LINUX環境では「LF(\n)」が使われている場合があり、混在データが作成されることも・・・
混在したままのデータを使用すると、意図しない部分に改行が入ってしまい、Excelに取り込むと不要行が作成される、などの二次災害を引き起こすことがありますね。(ありました)
ネットで調べても「CRLFを残したまま、LFだけを1回で一括削除する」という方法が見つからない!
この1回で、という部分がミソです。
①「\nを置換する→\r\nの\n部分も消える」
②「データをCRLF形式で保存する」
この2Stepでの置換方法が書かれている記事は沢山引っかかります。
でも、1回で置換する方法は書かれていないわけで・・・
できないのか!?
不可能なのか!?
結論としては「できました」。
正規表現とサクラエディタの置換を使用すれば簡単にできます。
少ない手順でできるならそれに越したことはないよねってことで。
Stepが少なければヒューマンエラーも防げるしね。
ということでちょっとメモしてみました。
■改行データの混在
とあるデータベースからCSVをダウンロード保存すると、以下のようなCSVが出来上がってしまいました。
あれれ~?
おかしいぞ!購入日がD列に入力されずにA列の名前行+1に入力されている!
何が起こっているんだ~?!
因みにこのデータは大人の事情で今は7行ですが、本来は1000行以上あります。
これは参った。
手動での修正は不可能(絶対にやりたくない)です。
とりあえず原因を追究してみましょう。
CSVファイルの常套、わからない場合はエディタで開く ◀
行のお尻に改行コードが入っていますね。
ふむふむなるほど。
下↓が\n、鍵↓が\r\nなのか~。
なるほど。
ここでそっ閉じしてみなかったことにしたい気持ちを抑えて。
ぶっちゃけExcelで後から編集すればよくね?とかいう気持ちは一旦忘れましょう。
マンパワー最高!っていう脳筋はとりあえず忘れてください。
ここでやりたいことは1つ。
「\n改行を消したい」
これを実現するためには、「\r\nを残して、\nだけを消し去りたい」わけです。
そっかー(*'▽')
簡単じゃん!\n削除でしょ?秒で終わるやん!
簡単簡単!
CTRL+Rで検索ウィンドウ出して置換前に\n、置換後に何も入れずに・・・
できた!(*'▽')
残念。できてません。
おわかりいただけただろうか。
下←は消えましたが、今度は左←になっていることを。
ここでちょっとエディタの改行について追記します。
Qiita使うのが初めてなので、表とか作れないのは御愛嬌。
改行コードは、以下の3つが存在します。
それぞれの詳しい説明はググってねw
エディタによって違うかもしれませんが、サクラエディタでは以下のように各改行コードは表示されます。
CR(\r) : ←
LF(\n) : ↓
CR+LF(\r\n) :↩
つまり・・・
「\nを削除したことによって、CRLFの\nも削除してしまいCRになってしまった」
という現象が起きたわけです。
ややこしいな!!!
空気嫁!!!
長い茶番でしたが、ここでやっとタイトルに結び付きました。
CRLFを残してLFだけを消し去りたい。
つまり、「\r」がついていない「\n」を削除すればいいわけです。
因みにこの状態からでも、エディタの「名前を付けて保存」を選び、改行コードを「CRLFで保存」にすれば万事解決します。
もしくは、再度\rを\r\nに置換すればいいんです。
ただ、1回でやれるなら1回でやれよっていわれる訳ですよ。(経験談)
偉い人というのは手間を嫌がるもんです。
だから仕方なく1回でできる方法を考えることにしました。
サクラエディタは「正規表現」を使うことが可能です。
正規表現についての詳しい説明は省きますが、
簡単に言うと、「文字列を規則に従って1文で表現できる」というものです。
簡単な条件分岐(ORやAND、否定など)も1文で表現できてしまいます。あら凄い。
正規表現についてはネットの海にいくらでも例文が浮かんでいるので、この記事の最後の参考URLを見て下さい。
僕の文章力では説明できない、という真実は内緒にしておきましょう。
正規表現についてはある程度理解していることを前提に話を進めます。
今回やりたいのは、「\rが含まれていない\nを削除する」ことです。
言い換えると「\rが前についていない\nを削除すること」ですね。
この場合、「否定後読み」を使います。
条件の書き方についても、肯定先読み|後読み、否定先読み|後読みの4つのパターンがあるわけですが、こちらも文末の参考URLをご参照ください。
とても分かりやすくまとめてくださってる方がいらっしゃるので先人の知恵を借りましょう。
さて。
「\rを否定した後、\nを探して置換する」
先に否定をするわけですね。否定後後読みでいけそうですね。
否定後読みのフォーマットは(?<!●●)。
こう書くと、「●●と一致しない」という意味になるようです。
これは使えるのでは・・・?
とりあえず考えるより先にやってみましょう。
実行!どーん。
はい、お疲れさまでした。
一回で正しく変換されました。
念のため、Excelでも開いてみましょう。
表が完成しました!
これで安心して毎週のフルーツの購入管理ができるようになりましたね。
果たしてフルーツの購入表をLINUX環境で管理するユーザーシナリオがあるかどうかは別ですが。
以上、個人的メモでした。
ばんざーい(*'▽')
参考URL:https://userweb.mnet.ne.jp/nakama/
https://qiita.com/tohta/items/2ba7ecde5636b38ef1f6