- PR -

セル内に改行コードが存在するCSVの取り込み方法

投稿者投稿内容
Hiro
会議室デビュー日: 2004/10/08
投稿数: 5
投稿日時: 2006-12-06 16:31
別のツールから出力されたCSVファイルをACCESSのMDBに取り込む際に
カンマと改行で判断しながら登録をしているのですが、
CSV内にセル内での改行が含まれているファイルを上手く処理する方法が見つけれません。

列数が256を超えないものについては、一度、Excelで開き、置換機能にて「Ctrl+J」を
ブランクで置換する事で対応したのですが、400近い列数のExcelで開く事が
出来ないファイルもあり、それらのファイルの回避策を見出す事が出来ません。
(行の方は30,000近くあり、手作業で進める事が難しい状態です。)

Java側で作業が出来るにこした事はないのですが、上記のように何らかのツールを
使ってでも対応出来ればそれでも構わないと思っています。

どなたか、良い方法をご存知ないでしょうか?
Tasuku
大ベテラン
会議室デビュー日: 2006/09/14
投稿数: 106
お住まい・勤務地: tokyo
投稿日時: 2006-12-06 16:55
CSVの1レコードの区切りが [CR][LF]
1セル内の改行が [LF]
と区別されていても、正常に読み込めないですか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-12-06 17:10
単にアルゴリズムの話だと思います。
たぶん、BufferedReader.readLine()で1行単位で読み込んで処理をしているのでしょう。

私の手元で確認したところ、"ABC改行DEF"というセルを作ってCSVで保存すると
コード:
"ABC
DEF"


というデータになりました。
情報が失われているわけでもなんでもないわけですね。

行をカンマごとに分解した際に、最後のパーツがダブルクォーテーションで
始まっているのに閉じられていない場合に改行をはさんで次の行も
読み込むようにプログラムしてやれば大丈夫でしょう。
ちょっとループのさせ方を工夫する必要はありますが。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2006-12-06 17:40
蛇足ですが・・

http://www.rfc-editor.org/rfc/rfc4180.txt

二重引用符で括られていればCRLFでも正しく扱えるように書くべきです。けっこう面倒なことにはなりますが、仕方ないと諦めてます(苦笑

(escapeされていない)二重引用符に挟まれたCRLFだけを適切な文字列に置換して出力する・・なんてツールはパッと書けそうな気はします。

[ メッセージ編集済み 編集者: shimix 編集日時 2006-12-06 17:45 ]
Hiro
会議室デビュー日: 2004/10/08
投稿数: 5
投稿日時: 2006-12-06 17:51
Tasukuさん、nagiseさん返答ありがとうございます。

確かに、ダブルクォーテーションが対にならなかった場合に次の行も読み込む
というので対応出来そうですね。

既に稼働しているソースの改善という事であまりロジックを触りたくなく
データの方をどうにかしてやろうという意識に強く固執していました。

ありがとうございました。

・・・Excel2007のベータ版をダウンロードしようかと迷ってました。笑
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-12-06 19:10
正規表現を用いれば簡略化できると思います。
コード:

(?=(?:[^\"]*\")),(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))


上記パターンにマッチするまで行を連結し、マッチしたら連結した文字列を同パターンで分割します。
ダブルクォーテーション(")で括られたカンマ(,)は分割対象にしていません。

ただし、整合性の確認まではしていないので、
以下のような場合は正しく処理されません。
コード:

(")で始まっていない
aaaaa","bbbb","ccc"

(")で終わっていない
"aaaaa,"bbbb","ccc"

項目内の(")の数が正しくない
aaaaa,bbbb,"cccc"ccc"



[ メッセージ編集済み 編集者: うにくま 編集日時 2006-12-06 19:11 ]
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2006-12-06 19:31
たかだか50〜60行のプログラムなので書いてもいいくらいですが、
引用符で囲まれた欄データに"を入れるとデータとしては2重引用符になるので注意が必要です。
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-12-06 20:42
なんか、複雑な話になっていますが、最初に行を読むときにダブルクォートが奇数個だったら、次の行を連結すればいいのではないでしょうか?

スキルアップ/キャリアアップ(JOB@IT)