- ベストアンサー
vb.netでCSVファイルを変換して新しいCSVファイルを作成
- vb.netでCSVファイルを変換し、重複のない新しいCSVファイルを作成する方法について教えてください。
- ファイルtoファイルでデータベースを使用せずに、vb.netでCSVファイルの内容を変換する手順を教えてください。
- vb.netを使用して、CSVファイルを変換し、重複のないデータを含む新しいCSVファイルを作成する方法を教えてください。
- みんなの回答 (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()
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
(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代は複数人出現するのでしょうね。例はその点を判るように挙げるべき。 当然該当者は足しこむのだろうね。
お礼
色々なやり方を教えていただくと、本当に助かります。 出来る限り他のやり方も試したいと思います。 例のA組の10代は足しこんだ後の数値でした。しかし例が分かりにくかったと思います。今後気をつけるようにします。 大変為になりました。ありがとうございます。
- bin-chan
- ベストアンサー率33% (1403/4213)
入力CSVファイルに対し、ODBCテキストドライバーを割り当て。 テーブルとして操作できるので、クロス集計する。 クロス集計で得られた結果をCSV出力。
お礼
教えていただいたやり方はやってみようと思っています。 調べてみたのですが、datasetやdatatableの使い方をまだ理解できていないので、もうちょっと勉強していきます。 助かりました。ありがとうございます。
お礼
思い通りに出力をすることが出来ました。 キーを二つ持つやり方を色々試していたので、まさにやりたいことを教えていただきました。 大量のデータを扱う場合でも遅くならないか検証をしていこうと思います。 大変助かりました。ありがとうございます。