Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

有効なカンマを含むCSVの分離~Regex

有効なカンマを含むCSVの分離~Regex
123 , "a , bb ,cc " , ' 漢字、ひらがな、カタカナ' , 備後国 ,上州
こういうデータがCSV形式で提供されることが、往々にしてあります。
ExcelなどのアプリケーションでCSV出力したとき、データとして","があったとき、"か'で括ることになっているのかもしれません。
受け取る側で、"か'を考慮して分離する必要があります。処理としては最初から読んでいき、Quateの出現回数の偶数奇数で有効カンマか否かの判定すれば、良いのですが、正規表現で実装してみました。

ここ

最後に ","が付かないとき、最後の項目を落とし勝ちです、肯定先読み(?=(,|$))で対処すると、1つのパターンで対処できます。
パターン = "\s*(?<a>["']?)(?<fact>.*?)(?(a)\k<a>)\s*(?=(,|$))"

・少し解説
切り出した単語は Group名<fact> に格納されます。

"~" もしくは '~' もしくは {無冠}から{無冠} の区別は (?<a>["']?) で判定します。 "か ' のいずれかが始まると、<a>に値が格納されます。{無冠}の時は、<a>は未確定で続行されます。
<a>が確定しているときは(?(a)\k<a>)が有効で、<a>の種別で括った範囲が <fact>に格納されます。
<a>が未確定のときは(?(a)\k<a>)が無視されねので普通に <fact>に格納されます。

投稿日時 : 2008年8月31日 23:15

Feedback

# re: 有効なカンマを含むCSVの分離~Regex 2008/09/01 16:01 えいる/孤月

こないだ挨拶させてもらったこげつですー

要素に長文が入る場合など、要素内での改行が入る場合があると思うのですが、そういった場合の対処はどうするのが良いでしょうか?

僕がCSVのパーサ作ったときは頭からデータを読むようなパーサを作成して対応したのですが、正規表現を使用した場合どうなるか気になります。

# re: 有効なカンマを含むCSVの分離~Regex 2008/09/01 22:07 Ognac

'xx\nxx' ゃ "xx\nxxx" などのように コーテーション内の 改行にも対応してみました。
http://www.ognogn.com/Regex/CSV_Data_Separate.aspx

・マッチ文 : MatchCollection mc = Regex.Matches(txt, pat , RegexOptions.Singleline | RegexOptions.Compiled);
Regex.Option にRegexOptions.Singlelineを明記することで、 .* の. は \nを含むことができます。
(*) 無指定はRegexOptions.Singleline ではないんでよ。まったくもぉ。

改行対応はできたのですが、そもそも CSVは1件一行が前提なので、途中に改行を含むデータを CSVとは言えない気がします。
実務上は、CSVとしてではなく、他の形式での対応になるのでしょうね。
マルチライン行では対応できないので、有効な改行が登場する、局面の切り分けのほうが難しいかも知れまねんね。

# re: 有効なカンマを含むCSVの分離~Regex 2008/09/02 15:06 えいる/孤月

レスありがとうございます!
速度調べてみて正規表現が早かったらコード変更しようかな。。。

>そもそも CSVは1件一行が前提なので、途中に改行を含むデータを CSVとは言えない気がします。
これには非常に同感です、自分でデータを出力するのであれば改行入りデータをCSVで出力はしたくないですね。。。

ただ、外部のサービスから落としてきたデータを使用する場合ですと、結構そういったデータを見かけます
某ショッピングモールサイトの、商品管理用データを一括で落としてくるとCSVで、商品の説明文の項目には改行入りのHTMLデータがまるまると。。。(笑

タイトル
名前
Url
コメント