• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBを2008を用いてCSVを取り込む ””で区切られていない数値混入)

VB2008でCSVを取り込む方法

このQ&Aのポイント
  • VB2008でCSVファイルを取り込む際に、数字の混入や文字列内のコンマを扱う方法について質問です。
  • 現在、VB2008でCSVファイルを取り込んでいるが、文字列内のコンマに対処できず、データが正しく認識されない。
  • CSVファイルを取り込む際、ダブルクォーテーションで囲まれたデータは1つのデータとして扱いたいが、ダブルクォーテーションがない場合はコンマまでが1つのデータとして扱いたい。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

自力でやるよりTextFieldParserクラスがお勧め http://www.atmarkit.co.jp/fdotnet/dotnettips/487csvparser/csvparser.html

aukory3m
質問者

お礼

ありがとうございます。参照サイトをみてすごくよさそうなのですが、各項目のデータを引き出すことができない状態です。 ASPXでやっているとConsole.WriteLine()も画面にはまったく表示されず、 他の例でつかっていたLabel1.textに代入させることもできなくて。。。 データの抽出自体は””を取り除き、””内のコロンも無視できるのでこの手法でいきたいのですが。 もうすこし検討してみます。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

【考え方】 1.引用符内部のカンマを特定文字に変換する。 2.カンマで区切る。 3.各要素において特定文字をカンマに変換する。 特定文字は入力できないような文字にしておく。 Imports System.Text.RegularExpressions '---- 中略 ----   Const 特定文字 As String = Chr(0)   Dim 正規表現 As Regex = New Regex("\""(.*?)\""") '引用符内部を示す正規表現   '与えられた文字列をカンマで区切り、文字列の配列を返す   '但し、引用符内部のカンマは区切り文字とは見なさない   Function 分割処理(ByVal 指定文字列 As String) As String()     '★1.引用符内部のカンマを特定文字に変換する     Dim 変換後文字列 As String = 正規表現.Replace(指定文字列, AddressOf 内部変換)     '★2.カンマで分割する     Dim 配列() As String = 変換後文字列.Split(",")     Dim I As Integer     For I = 0 To UBound(配列)       '★3.要素内の特定文字をカンマに変換する       配列(I) = 配列(I).Replace(特定文字, ",")     Next     分割処理 = 配列   End Function   '引用符内部の文字列を置換する   Function 内部変換(ByVal 一致部分 As Match) As String     内部変換 = 一致部分.ToString().Replace(",", 特定文字)   End Function 正規表現の使い方を習得すると、何かと便利なのでお勧めします。

aukory3m
質問者

お礼

ありがとうございます。 正規表現自体は利用したことがあったのですが、今回の事例も正規表現を使えば、考える挙動がだせると勉強になりました。 今回は、他の回答者のかたのTextFieldParserを使用と思いますが、こちらについても勉強しようと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

コードなど書いて質問が長いが、コードを考える前に、どういうロジックでやれるのかはっきりさせる必要がある。 どういう風にやれば旨く行きそうなのかは、質問者で無いとわからない。 頻度や用途にも関係するから。質問には、データ例も挙げられていないし判らない。またプログラムのスキルもある。例えば正規表現に慣れていない人にそれを使う回答は無意味。 特にカンマの誤混入(?)は痛い。本当に誤混入なのか? このへんを補足で説明してほしい。 ーー CSVファイルは色々数種の方式がある。項目内容について カンマで区切る、は動かせないが A.ダブルクオートで全て囲む B.文字列だけ囲む。数値は囲まない C.全て囲まない など。 >””で区切られていない数値混入 はB。のケースで無いのか? Aなのに異例的に数値があるということか。 ーーー >文字列に,が含まれている場合がある。 入力ミスか?本来のカンマの使い方が文字列にあるということか。 参考 http://soudan1.biglobe.ne.jp/qa5012895.html エクセルなどではカンマもダブルクオートの中だとカンマの扱いのようだが。 http://d.hatena.ne.jp/verdana/20091023/1256322414 ーー VB.NET固有のCSVを扱うプログラムで処理してどうなりますか http://www.cocoaliz.com/vb.net/index/25/ など ==== (1000行ぐらいなら)テキストエディタなどで、人間がチェックして、プログラムでは発見・修正が難しくなる個所を手入力で修正し、中間ファイルをつくるのが一番早いと思うが、いかが。 ーー 前段階処理として、またはその疑わしきでもよい、個所をプログラムで摘出し、数を限定・少数に出来ないか。

aukory3m
質問者

お礼

ありがとうございます。 確かに質問が長くて見づらいとは思うのですが、ソースは書いてあるほうが回答者の方も理解しやすいと思い、記載しました。 今回のデータは業務で使用しているPCから出力されるCSVで売り上げデータなどが入力されているものです。 実際のデータは都合上、掲載できませんが、Dに該当する部分が商品名にあたるもので たとえで言うと「炭酸水 1,000mL」という感じです。 テストしていた段階では商品名に「,」がはいっていなかったのでうまく動作していたのですが、ごくごく一部に「,」が含まれていたために、今回の質問をいたしました。 また今回のプログラムはWEB上に設置して、各店が売り上げデータを中央のサーバーに送り、DBに登録するようなものなので元のCSVファイルを人間がチェックというのは考えておりません。(リテラシーがないひとでも動作できるものを作らないといけないので) 業務で使用しているPCから出力されるCSVもすべてを””を括ってくれれば苦労しないのですが、それも業務用のものなので仕様の変更はできません。 他の方が提案されている方法でいろいろ検討しようと思います。

関連するQ&A