vb.netでCSVファイルを変換して新しいCSVファイルを作りたいのですが、どのようにすれば良いかヒントを教えていただけないでしょうか?
A組,10代,10
A組,20代,20
A組,30代,30
B組,10代,40
B組,20代,50
B組,30代,60
C組,10代,70
C組,30代,80
この様なCSVファイルを変換して
,A組,B組,C組
10代,10,40,70
20代,20,50,
30代,30,60,80
という表のようなCSVファイルを作りたいのです。
データベースなどに入れずに、ファイルtoファイルでの変換がしたいです。
最初のファイルの1列目と2列目の項目をそれぞれ配列に入れて重複をなくす位までは思いつくのですが、そこから先がどの様にすれば良いかよく分かりません。
ヒントだけでも良いのでよろしくお願いいたします。
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/215 …
のようにVB.NETになってやれることが増えた。自作しないでも良いかも。
「vb.net 配列 ソート」でGoogle照会のこと。
配列のソート的なことも出来る。
ーー
>A組,B組,C組
10代,10,40,70
A組10代は複数人出現するのでしょうね。例はその点を判るように挙げるべき。
当然該当者は足しこむのだろうね。
色々なやり方を教えていただくと、本当に助かります。
出来る限り他のやり方も試したいと思います。
例のA組の10代は足しこんだ後の数値でした。しかし例が分かりにくかったと思います。今後気をつけるようにします。
大変為になりました。ありがとうございます。
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()
思い通りに出力をすることが出来ました。
キーを二つ持つやり方を色々試していたので、まさにやりたいことを教えていただきました。
大量のデータを扱う場合でも遅くならないか検証をしていこうと思います。
大変助かりました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Excel(エクセル) Excelについて。 Excelからcsv変換したいのですが、 やり方はファイル→名前をつけて保存→ 7 2022/07/27 01:10
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelですべての組合せ(重複組...
-
Excel VBAで並べ替えをしたい
-
C# DataTableの行をソートしてD...
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
Fortran77で多次元配列を並び替...
-
excel VBA リストビューの行...
-
配列の問題
-
マクロのコードを知りたい。値...
-
小さい順
-
新しい順のリスト取得
-
ヒープソートについて
-
SQL-SELECT文でのソート
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAで質問です。離れた二...
-
c言語
-
C言語 配列の長さの上限
-
パイソンの
-
_tcscpy_s(wcscpy_s)の第二引数...
-
mallocについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
ファイル名「1.jpg ~10.jpg~...
-
excel VBA の条件をつけての列...
-
リスト構造のソートで悩んでま...
-
C# DataGridView のヘッダーセ...
-
DataGridViewの複数列を連動し...
-
文字列をソートする方法
-
C# DataTableの行をソートしてD...
-
C言語・要素除去
-
Excelですべての組合せ(重複組...
-
VBA基本構文の作り方 2列の...
-
列のどこをクリックしてもソー...
-
excel VBA リストビューの行...
-
あるディレクトリ内のファイル...
-
コレクションの数値をSortで並...
-
数字文字列のソート方法
-
VBScriptで重複レコードを削除...
-
2次元配列を複数項目でソートし...
-
10個の整数を入力して小さい順...
おすすめ情報