none
改行コードを含む CSVファイルを読み込む方法を教えてください。 RRS feed

  • 質問

  • こんばんわ!
    皆様、お世話になります。

    下記のような方法で csv ファイルを読み込んでいますが、私のこれまでの理解が間違っていたようで困っています。

        textFile = new System.IO.StreamReader(path, System.Text.Encoding.Default);
     
        line = textFile.ReadLine();
     
    この場合、各列のデータ中に【改行】が含まれていると、ここでレコードが分断されてしまうようです。

    これまで、上記の方法で csv ファイルを読んでいましたが、たまたまデータに "\r" が含まれておらず
    旨く行っていたようです。

    csvファイルでは、カンマで列、 "\r\n" でレコードが区切られていると認識しており、上記の方法で
    "\r\n" までを 1行で読み込んでいると考えていましたが、どうも間違っていたようです。
    恥ずかしながら今になって分かったのですが、上記の方法では "\r" で区切って読み込んでます。

    と言う事で、データの中に "\r" を含むレコードを分断されることなく読み込むには、どのようにすれば
    良いのでしょうか。

    よろしく、ご教授くださいますようお願いいたします。

    2010年2月9日 14:10

回答

  • ReadLine()ではこの場合対応できません。Readメソッドで1文字ずつ読んで対応するなどが考えられますが、今回のケースですとTextFieldParserクラスを使った方が簡単に実現できると思います。

    CSVファイルを読み込むには?[2.0のみ、C#、VB]
    http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年2月10日 0:58
    モデレータ
  • すみません、先のレスが舌足らずで、ちょっとピントが外れていたので、改めて
    レスさせてください。

    「改行コード」について調べてもらうと分かりますが、Windows は CR + LF、
    Unix は LF というようにプラットフォームよって異なります。

    CSV ファイルはテキストエディタで編集できることが利点ということですので、
    どのプラットフォームで作られた CSV ファイルでも対応できるように作るのが
    よさそうです。(と言いたかったのです)

    改行コードがフィールド値の中にある場合は、フィールド値をダブルクォート (")
    で囲むと言った約束を設けて対応しているようです。カンマ (,) がある場合も同
    様です。

    というわけで、パーサーを作るのはそう簡単ではないのですが、"CSV" "Parse"
    ".NET" などをキーワードに検索すると、参考になるページが見つかると思います。

    例えば、下記のページではパーサーのバイナリ (dll) やソースも手に入ります(ソ
    ースを見ても理解するのは大変ですが)。

    A Fast CSV Reader
    http://www.codeproject.com/KB/database/CsvReader.aspx

    2010年2月10日 14:26
  • > Microsoft.VisualBasic.FileIO が、「なんだかんだ・・・」って怒られてしまいました。

    たぶん参照設定がされてないからだと思います。「参照の追加」で Microsoft.VisualBasic
    を追加して試してみてください。

    Fast CSV Reader を紹介しておきながら何ですが、日本語環境では問題ありそうです。ちょ
    っと試してみたところ、UTF-8, UTF-16 なら日本語も処理できましたが、Shift_JIS に対応
    していないようです。普通、日本語環境で CSV ファイルというと Shift_JIS が使われてい
    るようなので、Fast CSV Reader を日本語環境で使うのは無理そうです。

    Jet Provider を使うのも簡単な方法ですが、これは UTF-8, UTF-16 に対応していないのが、
    個人的には気に入らないです。

    やはり、trapemiya さんが紹介された TextFieldParser クラスが、改行コード、エンコーデ
    ィングなどすべて対応しているようで、一番よさそうです。

    2010年2月11日 6:44
  • 「参照の追加」と言う事は、

       using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    入れたつもりなのですが、ダメだったように記憶しています。

    ソリューションエクスプローラ等の「参照の追加」で、Microsoft.VisualBasic.Dll をプロジェクトに加えてますか?
    2010年2月11日 15:14
    モデレータ
  • 先のレスで、

    > Fast CSV Reader を紹介しておきながら何ですが、日本語環境では問題ありそうです。

    と書きましたが、よく調べてみると Shift_JIS も問題なしでした。よく調べもせず、い
    いかげんなことを書いてすみません。> ALL

    という訳で、今は、個人的には、Fast CSV Reader が一番よさそうに思えています。

    > 「参照の追加」と言う事は、
    >
    >   using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    それも必要ですが、ひらぽんさんが書かれたように、以下の dll を参照に追加する必要
    があります。

    C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll

    方法は以下の通りです。

    (1) ソリューションエクスプローラで「参照設定」を右クリック

    (2) 出てきたコンテキストメニューで「参照の追加(R)」をクリック

    (2) 参照の追加ダイアログが表示されるので、そこで「.NET」タブを選択

    (4) 「コンポーネント名」欄で Microsoft.VisualBasic を探す

    (5) 見つかったらそれをクリックして選択し、[OK]ボタンをクリック

    2010年2月12日 13:21
  • >いつまでも質問を引きずって申し訳ありませんが、「参照の追加」と言う事は、
    >
    >   using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    違います。

    それは「名前空間のインポート」で、「参照の追加」とは異なるものです。



    2010年2月12日 15:06
    モデレータ

すべての返信

  • 「改行コード」で検索してみれば答えが見つかると思います。

    2010年2月9日 14:36
  • ReadLine()ではこの場合対応できません。Readメソッドで1文字ずつ読んで対応するなどが考えられますが、今回のケースですとTextFieldParserクラスを使った方が簡単に実現できると思います。

    CSVファイルを読み込むには?[2.0のみ、C#、VB]
    http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2010年2月10日 0:58
    モデレータ
  • すみません、先のレスが舌足らずで、ちょっとピントが外れていたので、改めて
    レスさせてください。

    「改行コード」について調べてもらうと分かりますが、Windows は CR + LF、
    Unix は LF というようにプラットフォームよって異なります。

    CSV ファイルはテキストエディタで編集できることが利点ということですので、
    どのプラットフォームで作られた CSV ファイルでも対応できるように作るのが
    よさそうです。(と言いたかったのです)

    改行コードがフィールド値の中にある場合は、フィールド値をダブルクォート (")
    で囲むと言った約束を設けて対応しているようです。カンマ (,) がある場合も同
    様です。

    というわけで、パーサーを作るのはそう簡単ではないのですが、"CSV" "Parse"
    ".NET" などをキーワードに検索すると、参考になるページが見つかると思います。

    例えば、下記のページではパーサーのバイナリ (dll) やソースも手に入ります(ソ
    ースを見ても理解するのは大変ですが)。

    A Fast CSV Reader
    http://www.codeproject.com/KB/database/CsvReader.aspx

    2010年2月10日 14:26
  • すみません、先のレスが舌足らずで、ちょっとピントが外れていたので、改めて
    レスさせてください。

    SurferOnWww さん、「すみません・・・」と仰ると、恐縮してしまいます。

    あの後、反省の気持ちも込めて、ネットをあちこち探してみました。
    どうも、CSVファイルには悩ましい問題があるようですね。
    余り、知識がないままに、色々な書き込みを読むと、細かな事が頭の中でゴチャゴチャ
    になって、かなり混乱してしまいました。

    そこに、trapemiya さんからのレスが入り、「これだっ・・・」と色めき立ち、早速試して
    みたのですが、

    Microsoft.VisualBasic.FileIO が、「なんだかんだ・・・」って怒られてしまいました。

    要するに、追加された「TextFieldParserクラス」をC#から旨く使えない訳で、
    またまた知識不足を露呈して断念。

    色々考えた末、やりたい事は特定のアプリから出力されるCSVファイルの読込なので、
    1バイトづつバイナリーで読み出し、必要な処理を加えるのがてっとり速いとの結論に
    至り、あまりスマートではありませんが一定の見通しが立ちました。

    そんな事で、教えて頂いた「TextFieldParserクラスの利用」や「A Fast CSV Reader」
    については、少し落ち着いてから再挑戦したいと思っています。
    その際には、また質問など投げかけると思いますが、どうぞ宜しくお願いいたします。

    みなさま、ありがとうございました。
    2010年2月11日 4:52
  • > Microsoft.VisualBasic.FileIO が、「なんだかんだ・・・」って怒られてしまいました。

    たぶん参照設定がされてないからだと思います。「参照の追加」で Microsoft.VisualBasic
    を追加して試してみてください。

    Fast CSV Reader を紹介しておきながら何ですが、日本語環境では問題ありそうです。ちょ
    っと試してみたところ、UTF-8, UTF-16 なら日本語も処理できましたが、Shift_JIS に対応
    していないようです。普通、日本語環境で CSV ファイルというと Shift_JIS が使われてい
    るようなので、Fast CSV Reader を日本語環境で使うのは無理そうです。

    Jet Provider を使うのも簡単な方法ですが、これは UTF-8, UTF-16 に対応していないのが、
    個人的には気に入らないです。

    やはり、trapemiya さんが紹介された TextFieldParser クラスが、改行コード、エンコーデ
    ィングなどすべて対応しているようで、一番よさそうです。

    2010年2月11日 6:44
  • たぶん参照設定がされてないからだと思います。「参照の追加」で Microsoft.VisualBasic
    を追加して試してみてください。
    ありがとうございます。

    いつまでも質問を引きずって申し訳ありませんが、「参照の追加」と言う事は、

       using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    入れたつもりなのですが、ダメだったように記憶しています。


    Fast CSV Reader を紹介しておきながら何ですが、日本語環境では問題ありそうです。ちょ
    っと試してみたところ、UTF-8, UTF-16 なら日本語も処理できましたが、Shift_JIS に対応
    していないようです。普通、日本語環境で CSV ファイルというと Shift_JIS が使われてい
    るようなので、Fast CSV Reader を日本語環境で使うのは無理そうです。
    お忙しい中、試して頂いたみたいで恐縮です。

    Fast CSV Reader は詳しく説明があるようなのですが、英文のためなかなか手間がかかります。
    やはり、SurferOnWww にも推薦頂いた TextFieldParser クラスに挑戦してみたいと思っています。

    どうも、ありがとうございました。
    2010年2月11日 14:59
  • 「参照の追加」と言う事は、

       using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    入れたつもりなのですが、ダメだったように記憶しています。

    ソリューションエクスプローラ等の「参照の追加」で、Microsoft.VisualBasic.Dll をプロジェクトに加えてますか?
    2010年2月11日 15:14
    モデレータ
  • 先のレスで、

    > Fast CSV Reader を紹介しておきながら何ですが、日本語環境では問題ありそうです。

    と書きましたが、よく調べてみると Shift_JIS も問題なしでした。よく調べもせず、い
    いかげんなことを書いてすみません。> ALL

    という訳で、今は、個人的には、Fast CSV Reader が一番よさそうに思えています。

    > 「参照の追加」と言う事は、
    >
    >   using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    それも必要ですが、ひらぽんさんが書かれたように、以下の dll を参照に追加する必要
    があります。

    C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll

    方法は以下の通りです。

    (1) ソリューションエクスプローラで「参照設定」を右クリック

    (2) 出てきたコンテキストメニューで「参照の追加(R)」をクリック

    (2) 参照の追加ダイアログが表示されるので、そこで「.NET」タブを選択

    (4) 「コンポーネント名」欄で Microsoft.VisualBasic を探す

    (5) 見つかったらそれをクリックして選択し、[OK]ボタンをクリック

    2010年2月12日 13:21
  • >いつまでも質問を引きずって申し訳ありませんが、「参照の追加」と言う事は、
    >
    >   using Microsoft.VisualBasic.FileIO;   じゃ、ないのでしょうか?

    違います。

    それは「名前空間のインポート」で、「参照の追加」とは異なるものです。



    2010年2月12日 15:06
    モデレータ
  • SurferOnWww さん、ありがとうございます。

    一つ先の、ひらぽん さんからのレスで頂いた、

    > ソリューションエクスプローラ等の「参照の追加」で、Microsoft.VisualBasic.Dll をプロジェクトに加えてますか?

    をキーに、あちこち調べて何とか使い方が分かり、その後、色々と試して目的のファイルが問題なく完全に読み込める
    所まで確認できました。

    ご親切に、「参照追加」の手順を書いて頂き、試した手順が間違っていなかった事も確認でき一安心です。
    本当に、ありがとうございました。(一応、目処が付いた所で 直ぐに レスを上げなくて、すいませんでした) 

    所で、Fast CSV Reader  の方も問題なく使えるのですね。
    SurferOnWww さんは、これが一番良さそうとの事で、私にその良さの違いが理解できるかどうか分かりませんが、
    また一度試してみたいと思います。


    ひらぽんさんへ、

     ヒント、ありがとうございました。

    皆さん、どうもありがとうございました。
    今後とも、どうぞよろしくお願いいたします。
    2010年2月14日 16:45