• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vb.netでCSVファイルを変換して新しいCSVファイルを作りたいの)

vb.netでCSVファイルを変換して新しいCSVファイルを作成

このQ&Aのポイント
  • vb.netでCSVファイルを変換し、重複のない新しいCSVファイルを作成する方法について教えてください。
  • ファイルtoファイルでデータベースを使用せずに、vb.netでCSVファイルの内容を変換する手順を教えてください。
  • vb.netを使用して、CSVファイルを変換し、重複のないデータを含む新しいCSVファイルを作成する方法を教えてください。

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

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

SortedDictionaryを使うのは如何でしょう? Dim Q As New SortedDictionary(Of String, _     SortedDictionary(Of String, Integer)) Qのキーは10代、20代、等の項目になります。 QのデータはSortedDictionaryで、キーはA組、B組等、 データは数値(3列目)です。 ランダムに書き込んでも、ソートされて記録されますので、 ファイルの入力処理後にFor Each文でデータを出力すれば 目的のように出力できます。 Dim A As New StreamReader("C:~.csv", _     Encoding.GetEncoding("shift_jis")) Dim B As New SortedDictionary(Of String, Integer) Dim C As New SortedDictionary(Of String, _     SortedDictionary(Of String, Integer)) Dim D As String Dim E Do Until A.EndOfStream     D = A.ReadLine     E = D.Split(",")     If Not B.Keys.Contains(E(0)) Then B.Add(E(0), 0)     Dim F As SortedDictionary(Of String, Integer)     If C.Keys.Contains(E(1)) Then         F = C(E(1))         If F.Keys.Contains(E(0)) Then             F(E(0)) = F(E(0)) + E(2)         Else             F.Add(E(0), E(2))         End If     Else         F = New SortedDictionary(Of String, Integer)         F.Add(E(0), E(2))         C.Add(E(1), F)     End If Loop A.Close() Dim G = New StreamWriter("C:\~.csv", False, _     Encoding.GetEncoding("shift_jis")) For Each H As String In B.Keys     G.Write("," & H) Next G.WriteLine("") For Each H As String In C.Keys     G.Write(H)     Dim F As SortedDictionary(Of String, Integer) = C(H)     For Each D In B.Keys         If F.Keys.Contains(D) Then             G.Write("," & F(D).ToString())         Else             G.Write(",0") '省略時はコメントアウト         End If     Next     G.WriteLine("") Next G.Close()

Hexantistyle
質問者

お礼

思い通りに出力をすることが出来ました。 キーを二つ持つやり方を色々試していたので、まさにやりたいことを教えていただきました。 大量のデータを扱う場合でも遅くならないか検証をしていこうと思います。 大変助かりました。ありがとうございます。

その他の回答 (2)

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

(1)エクセルVBAを知っておれば、エクセルの機能とVBAでできます。 ソート機能を途中で使うのが、一番ロジックが簡単になると思う。 (2)VB.NETからエクセルVBAに入り、エクセルVBAコードで処理をする方法もあります。 (3)アクセスがあればアクセスに持ち込んで(エクセル経由になるかも)、クロス集計するとか SQLで出来る。 (4)既に出ている、多様なファイルを扱えるODBC利用とか (5)VB.NETでは、CSVは各項目のレコードの初めからの位置が不定で、テキストファイルのソートはできないと思う。すると配列なりに一旦蓄えて、自作ソート(世代で)し、後は同世代複数レコードを1レコード化(フィールド化)すれば良い。 昔はメモリが少なく、レコードの溜め込み(配列)は避けたように思う。いまの人はその苦しみは少ない。 ーー (6)配列をソートせずに、全配列をなめて、その世代に該当する配列を探し出しても良い。 10代、20代、・・70代等7-8回繰り返せばよい。レコード数が膨大(何百万)でなければ、実行は直ぐ終わるだろう。 (7)配列のソート http://www.atmarkit.co.jp/fdotnet/dotnettips/215arraysort/arraysort.html のようにVB.NETになってやれることが増えた。自作しないでも良いかも。 「vb.net 配列 ソート」でGoogle照会のこと。 配列のソート的なことも出来る。 ーー >A組,B組,C組 10代,10,40,70 A組10代は複数人出現するのでしょうね。例はその点を判るように挙げるべき。 当然該当者は足しこむのだろうね。

Hexantistyle
質問者

お礼

色々なやり方を教えていただくと、本当に助かります。 出来る限り他のやり方も試したいと思います。 例のA組の10代は足しこんだ後の数値でした。しかし例が分かりにくかったと思います。今後気をつけるようにします。 大変為になりました。ありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

入力CSVファイルに対し、ODBCテキストドライバーを割り当て。 テーブルとして操作できるので、クロス集計する。 クロス集計で得られた結果をCSV出力。

Hexantistyle
質問者

お礼

教えていただいたやり方はやってみようと思っています。 調べてみたのですが、datasetやdatatableの使い方をまだ理解できていないので、もうちょっと勉強していきます。 助かりました。ありがとうございます。