CSVファイルの読み込みと書き込みの一般的な方法

このQ&Aのポイント
  • CSVファイルの読み込みと書き込みの一般的な方法について教えてください。
  • CSVファイルのデータ分割ロジックやエスケープ処理について詳しく教えてください。
  • 外部ライブラリを使わずにCSVファイルを分割する際の考え方や注意点を教えてください。
回答を見る
  • ベストアンサー

CSVファイル読み込み、書き込み時の一般的な方法

いつもお世話になります。 下記CSVデータの場合の分割された結果を示していますが、データを分割する際、一般的には、 どのような考え方で分割するロジックを組めばよいでしょうか。 CSVファイル読み込み、書き込み時におけるルール。 (間違っている、漏れているなどありましたらご指摘頂ければと思います。) ・ダブルコーテーションで括る必要のあるデータ  以下のデータを含むデータ。   区切り文字、改行、ダブルコーテーション ・ダブルコーテーションが入るデータは、ダブルコーテーションでエスケープする  aa"bb ⇒ aa""bb   上記ルールに則ったCSVファイルの読み込み方。  123,aaaaa,ああいい,"13,55","aa""bb","ab(改行)ZZ","ああ"",いい"   ↓  データ1 123  データ2 aaaaa  データ3 ああいい  データ4 13,55  データ5 aa"bb  データ6 ab(改行)ZZ  データ7 ああ",いい    上記結果になるようにデータを分割すればいいのですが、データにダブルコーテーションがある 場合、書き込み時に付与、読み込み時に削除、という具合にデータの編集処理が入ってしまうが いいのか、何かのミスで、ダブルコーテーションがエスケープされておらず、カンマと連続で 定義されていた場合「",」、データの終わりを示してしまい、意図しない個所で分割されてしまうの ではないか、何かのミスでダブルコーテーションの始め、もしくは終わりの定義が漏れいた場合 (「・・・,"aaaa,・・・」「・・・,aaaa",・・・」など)、これも意図しない個所で分割されてしまう、 などなど、一般的にはどのようなロジックにしておけばよいのでしょうか。 そもそもロジックで全てを防ぐ事はできない、ということでしたら、事前にこれだけは決めておくべき、 というポイントがありましたら、教えて頂けると嬉しいです。 世の中には、CSVファイルを分割するためのライブラリなどが公開されていますが、 外部のライブラリを使用してはいけないプロジェクトの場合など、自分で自作する必要があります。 その際の一般的な考え方、注意点などを踏まえて作ることができれば、無用なバグを含ませる ことができずにすむので、皆様の考えを教えて頂きたいと思い、質問した次第です。 宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

それで問題はない。 逆に聞きたい。 余計なダブルコーテーションが入った時(またはダブルコーテーションが不足した時)どうしたいのか? データを解析して、余計なダブルコーテーションを自動削除(または不足するダブルコーテーションを自動追加)して読み込めるようにしたいのか? 普通はそこまでの面倒は見ません。 単純にデータエラーにします。(またはデータがずれたまま読みこまれる) CSVファイルなので、改行位置で分割したほうが都合が良いと思います。

kamakuragengorou
質問者

お礼

回答ありがとうございます。 > 普通はそこまでの面倒は見ません。 > 単純にデータエラーにします。(またはデータがずれたまま読みこまれる) 考えすぎということですね。ありがとうございます。 > CSVファイルなので、改行位置で分割したほうが都合が良いと思います。 これはどういう意味なのでしょうか? 改行コードが入っていても、ダブルコーテーションが入っている場合は一つのデータとみなすという 認識でいるのですが、改行部分で問答無用で次のレコードにした方がよい、とおっしゃっているのでしょうか?

その他の回答 (1)

回答No.2

CSVファイルの大前提として、データは行単位になっているということです。 ファイルを分割するときに、データの行単位で分割したほうが良いということです。 単純に文字数だけ見て、行の途中で分割したら、分割されたファイルをテキストエディタで見たときにわかりにくくなる。

関連するQ&A

  • CSVの仕様について

    改行コードとカンマの取り扱い。 最近の一般的なWINDOWSアプリケーションでCSVの取り扱いは (1) 行区切りの改行コードはCRLFで行います。 データ内の改行コードは、LFで行う。 (2) カンマ付きのデータは『"』クォーテーションで囲む その際、元のデータ内の『"』は『""』でエスケープ。 (1)(2)の仕様でよいのでしょうか? 自身でCSV生成とパースを書きたいのですが、RFCは参考にしますが、 実際のポュラーな仕様に合わせたいので調べています。 ご意見でも構いません宜しくお願いします。

  • テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】

    テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】 <CSVファイル例> "aaaa","bbb<改行コード 0d0A>bb","ccc" 上記のようなCSVファイルを、 ダブルクリックにてExcel起動すれば正常に表示されますが、 テキストファイルウィザード(データ→外部データ取り込み→データの取り込み) を使用して、読み込みを行うと改行されて表示されてしまいます。 これは、Excelの仕様なのでしょうか? ご存知の方いらっしゃいましたら教えていただけますでしょうか? 現在の本質的な問題は、 ------------------------------------------------------------------- Excel2003にて、文字コードがUTF-8のCSVファイルを下記方法にて読み込む ・テキストファイルウィザードを使用 ・文字コードをUTF-8 ・カンマ区切り設定 で読み込みを行うと文字化けしないで表示されるのですが ダブルコーテーション中のデータ内に改行コード0d0aが含まれると 改行されてしまいます。 ------------------------------------------------------------------- と言う現象の調査をしております。

    • 締切済み
    • PHP
  • PHP CSVの取扱

    仕様で,区切りで吐き出されるCSVがあるのですが splitで分割していくと データ内に,があるフィールドがあり 意図しないところで分割されてしまいます。 ""でくくっているようですが どうやってこの部分を分割すればよいでしょうか? 例 aaa,aaaa,"bb,bb",aaa を aaa aaaa bbbb aaa で分けたいです。

    • ベストアンサー
    • PHP
  • CSVデータを正規表現で抜き出せません・・・。

    お疲れ様です。初投稿になります。 どうぞ宜しくお願い致します。 CVSデータ(囲い文字:"(ダブルコーテーション))を正規表現でマッチングさせ、抜き出そうと考えています。 エスケープ文字を以下のように設定しています。 ・""(ダブルコーテーション * 2) ⇒ "(ダブルコーテーション) ・\"(円記号 + ダブルコーテーション) ⇒ "(ダブルコーテーション) ・\\(円記号 * 2) ⇒ \(円記号) 例えば・・・ "A",""",BB,"",\",CC,\\,DD""","EEEE","", ですと、「"A"」「""",BB,"",\",CC,\\,DD"""」「"EEEE"」「""」と取れる想定になります。 特に2番目の「""",BB,"",\",CC,\\,DD"""」は、 「"""(←escape),BB,""(←escape),\"(←escape),CC,\\(←escape),DD""(←escape)"」 という想定です。 PHP関数ではエスケープ文字の問題により取得しきれず、自力での取得を行っております。 私が考えた正規表現は「"[^"]*((""|\\")[^"]*)*[^\\]",|"",」となりますが、カンマが入り乱れる上記パターンを満たすことができません。 これは、正規表現での解決は不可能でしょうか? 何日も解決できず、困っています・・・。 是非、皆様のお力添えのほど、宜しくお願い致します。 PS. このサイトで動作確認を行っておりました。 参考になれば幸いです。 http://www.rider-n.sakura.ne.jp/regexp/regexp.php

    • ベストアンサー
    • PHP
  • csv形式について

    Access2000を使用しています。 データをCSV形式で吐き出したいのですが、その際、フィールドにデータが存在すれば、ダブルクォーテーションをつけ、空欄だった場合はダブルクォーテーションをつけないようにしたいと思っています。 実際にやってみると、空欄のフィールドに対してダブルクォーテーションがつくものと、つかないものとがあります。この違いはどこからきているのでしょうか? ご存知でしたら教えてください。よろしくお願いします。

  • CSVへの書込み

    はじめまして。 サーバー初心者でおかしな質問をしてしまっているかもしれませんが、どうかお付き合いくださいませ。 サーバー:fedora11 PHPでCSVファイルに書込みを行ったのですが、ダブルクォーテーション(")を表記したくて以下のようにしました。 ・PHP fputcsv( $data, Array('"犬"','300')); と表記したら ・CSV """犬""",300 と表記されてしまいます。 ・CSV "犬",300 というように表記するにはどうしたらよいかご存知の方いらっしゃったらお手数ですがご指導を御願いいたします。

    • 締切済み
    • PHP
  • CSVファイルへの文字列データの書き出しについて

    OS:WindowsXP、Excel:2003 です。 Excelマクロ(VBA)で、あるデータをCSVファイルに出力しているのですが、 文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 CSVへ書き出すときは、そういう仕様になっているということは分かったのですが、 処理の都合上、どうしてもダブルクォーテーションで囲まずに書き出ししたいと思っています。 そういう場合にはどのようにすれば良いのか教えて下さい。 ちなみに、書き出しは「Write」を使っています。

  • エクセル2010 CSVレイアウト崩れ

    「よくある質問」とはちょっと違うと思います。 あるCSVファイルを、そのままダブルクリックするとエクセルで開いてくれるPCがあります。 そのようにして開くとレイアウト崩れはありません。 で、同じCSVファイルをエクセルの「データ」→「外部データの取り込み」→「テキストファイル」で読み込むと、レイアウトが崩れてしまうのはなぜでしょうか。 なぜこのような質問をするのかというと、ちょっと説明が難しいのですが、なるべく簡潔に箇条書きにしてみます。 1 まず、このCSVファイルは自社で使っているオリジナルのシステムがCSV形式で吐き出すファイルであるという事実 2 このファイルは、ところどころ長文があり、セル内で改行が必要。なので長文の部分はダブルクォーテーションで改行を含め全体を囲んである。 3 従来はCSVファイルをそのままダブルクリックして開いて、内容をチェックする時、担当者がエクセル上でセル幅や高さをマウスで調節して文章を読んでいた。なお、その際にレイアウト崩れは発生したことがないので、もともとのファイルのCSV形式はちゃんと整って吐き出されているものと思われる。 4 しかし、いちいち手動でそんなことをするのは大変だろうと、私がマクロでCSVファイルを読み取り、自動的にセル内の文章を全部表示できるサイズに各行や列を自動調節できるようにしたいと考えた。 5 具体的には、まずマクロを記録したエクセルファイルを開き、そこから次のシートに当該のCSVファイルを読み取らせればよかろうと考えた。 6 ところが、シートにCSVファイルを読み込ませるために冒頭のような読み込み作業を行ったら、同じエクセルの同じバージョン、同じPCなのにも関わらず、レイアウトに崩れが生じた。 7 具体的にどの部分でレイアウト崩れが起きているのかをテキストエディターで調べると、やはり長文内の改行部分で次のセルに移動してしまっている。 8 しかし、改行部はダブルクォーテーション内に収まっており、(そうでなかったらCSVファイルを直接ダブルクリックしてエクセルを開いた際にもレイアウト崩れが生じていたはず)自分でも訳がわからなくなる。 9 つまり、CSVファイルをテキストデータとして読み込んだ際、設定で「カンマでセル移動、ダブルクォーテーションを「文字列の引用符」に指定しているにも関わらず、エクセルがダブルクォーテーションを無視しているとしか考えられない 10 なぜこのような違いが同じエクセルで生じるのかがわからない 11 いろいろ調べると、「ひょっとして改行コードの解釈の問題(例のLF+CRの問題)か?もしくはダブルクォーテーションのコードの解釈の違いがあるのか??」と思い当たる。 …と、以上のような経緯があったわけです。 それにしても不可解な話なので、どなたかエクセルに詳しい方の解説がいただけたらなあ…と思うのですが、いかがでしょうか。 もしくはどこかに、「一発でCSVファイルを正しく読み込んでくれるモジュールがあるよ」的なアドバイスをいただけると非常に助かります。 よろしくお願いいたします。長文失礼いたしました。

  • CSVファイルからダブルクォーテーションを削除したい。VBS使用で。

    CSVファイルからダブルクォーテーションを削除したい。VBS使用で。 CSVファイルのダブルクォーテーションを外す方法が Wendy02さん回答の http://oshiete1.goo.ne.jp/qa3016163.html (タブ区切りデータからダブルコーテーションを外したい) を使用してみました。 〔使用前〕 "1","00030123","00000000000000000000","00000000000000000019","4220120","42201","","1" 〔使用後〕 1,00030123,00000000000000000000,00000000000000000019,4220120,42101,",1" 使用後、ダブルクォーテーションで囲まれていない項目があると、 ダブルクォーテーションが残ってしまいます。 .Pattern ="""([^""]+)""" の部分を変更すれば、良いと思うのですが教えていただけないでしょうか?

  • EXCEL→CSV保存時のダブルクォーテーションについて

    下記のようにEXCELマクロにてEXCELファイルをCSVファイルに保存しようとしています。 NewBook.SaveAs Filename:="test.csv", FileFormat:=xlCSV, CreateBackup:=False このとき、セル値にダブルクォーテーションが含まれていると、出力CSVファイルの値がダブルクォーテーションで囲まれてしまいます。 ●ダブルクォーテーションが含まれていない場合 セル値→A列:ABC     B列:DEF CSVファイル→ABC,DEF ●ダブルクォーテーションが含まれている場合 セル値→A列:A"C     B列:DEF CSVファイル→"A"C",DEF 後者の場合もダブルクォーテーションで囲まれないようにするにはどうすればよいでしょうか。

専門家に質問してみよう