C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CSVファイルの読み込みについて


(過去ログ 62 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■36110 / inTopicNo.1)  CSVファイルの読み込みについて
  
□投稿者/ K (12回)-(2009/05/21(Thu) 00:08:29)

分類:[VB.NET/VB2005 以降] 

VB2005Express、WinXPにてフォームアプリの作成をしています。

CSVファイルで読み込んだデータを集計したいと考えています。

日付 ,商品名,売上数量,売上金額
20080401,AAAA , 1, 150
20080401,BBBB , 2, 200
20080401,CCCC , 4, 400
20080402,AAAA , 2, 300
20080402,BBBB , 1, 100
20080402,CCCC , 3, 300
・・・以下月末まで

と言うようなCSVデータがあった場合

商品名,1日_数量,1日_金額,2日_数量,2日_金額,・・・(同様に月末まで)
AAAA , 1, 150, 2, 300,・・・
BBBB , 2, 200, 1, 100,・・・
CCCC , 4, 400, 3, 300,・・・

と言うようなデータを出力したいと考えています。

ですが、どのように集計をすれば良いかがわからないです。
調べても参考になるものも無いのでどなたか教えてください。
引用返信 編集キー/
■36111 / inTopicNo.2)  Re[1]: CSVファイルの読み込みについて
□投稿者/ επιστημη (1942回)-(2009/05/21(Thu) 00:31:47)
επιστημη さんの Web サイト
CSVファイルをオープンし、一行ずつ読みだして
日付,商品名,売上数量,売上金額 をそれぞれ変数に
セットするとこまではできますか?

引用返信 編集キー/
■36114 / inTopicNo.3)  Re[2]: CSVファイルの読み込みについて
□投稿者/ .SHO (832回)-(2009/05/21(Thu) 08:50:10)
何が質問なのかわからないけど、タイトルどおり「CSVファイルの読み込みについて」なら
この処理限定でよければ、「,」で分割するだけでよいのでは?
商品名に「,」が含まれない前提だけど。
引用返信 編集キー/
■36115 / inTopicNo.4)  Re[2]: CSVファイルの読み込みについて
□投稿者/ K (14回)-(2009/05/21(Thu) 09:01:59)
No36111 (επιστημη さん) に返信
> CSVファイルをオープンし、一行ずつ読みだして
> 日付,商品名,売上数量,売上金額 をそれぞれ変数に
> セットするとこまではできますか?
>

CSVファイルを読み出し、それぞれを変数に格納することまではできます。
その後に、どうやってクロス集計のようにすればよいかが分からないです。
引用返信 編集キー/
■36116 / inTopicNo.5)  Re[3]: CSVファイルの読み込みについて
□投稿者/ やじゅ (1009回)-(2009/05/21(Thu) 09:11:09)
やじゅ さんの Web サイト
>■No36115 (K さん) に返信

1.TextFieldParserクラスを使ってCSVをDataTableにセット
2.DataView.Sort プロパティを使って、DataTableを商品名,日付の昇順でソート
3.出力用のDataTable構造を作成(参照:DataTableの構造とデータ作成)
4.DataView.Sortされた内容で、出力用のDataTable構造へセット

CSV形式のファイルをDataTableや配列等として取得する
.NET Framework 2.0以降で、TextFieldParserクラスを使用する方法
http://dobon.net/vb/dotnet/file/readcsvfile.html

DataTableによるメモリ上のデータベース
http://www.sm.rim.or.jp/~shishido/datatable.html

DataView.Sort プロパティ
http://msdn.microsoft.com/ja-jp/library/system.data.dataview.sort(VS.80).aspx
引用返信 編集キー/
■36117 / inTopicNo.6)  Re[3]: CSVファイルの読み込みについて
□投稿者/ επιστημη (1943回)-(2009/05/21(Thu) 09:12:47)
επιστημη さんの Web サイト
2009/05/21(Thu) 09:15:56 編集(投稿者)
↓アドリブで書いてみた。

Module Module1

    Sub AddRecord(ByVal dic As SortedDictionary(Of String, SortedDictionary(Of String, Integer)), ByVal name As String, ByVal ds As String, ByVal price As Integer)
        If Not dic.ContainsKey(name) Then
            dic.Add(name, New SortedDictionary(Of String, Integer)) ' "商品名"追加
        End If
        If Not dic(name).ContainsKey(ds) Then
            dic(name).Add(ds, 0) ' "日付"追加
        End If
        dic(name)(ds) = dic(name)(ds) + price ' ここで積算
    End Sub

    Sub MakeSummary(ByVal dic As SortedDictionary(Of String, SortedDictionary(Of String, Integer)))
        For Each name As String In dic.Keys
            Console.Write("{0} ", name)
            For Each datestr As String In dic(name).Keys
                Console.Write(",{0},{1} ", datestr, dic(name)(datestr))
            Next
            Console.WriteLine()
        Next
    End Sub

    Sub Main()
        Dim dic As New SortedDictionary(Of String, SortedDictionary(Of String, Integer))
        AddRecord(dic, "りんご", "0521", 10)
        AddRecord(dic, "みかん", "0521", 20)
        AddRecord(dic, "ぶどう", "0521", 30)
        AddRecord(dic, "りんご", "0522", 40)
        AddRecord(dic, "みかん", "0522", 50)
        AddRecord(dic, "ぶどう", "0522", 60)
        AddRecord(dic, "りんご", "0521", 10)
        AddRecord(dic, "みかん", "0521", 20)
        AddRecord(dic, "ぶどう", "0521", 30)
        AddRecord(dic, "りんご", "0522", 40)
        AddRecord(dic, "みかん", "0522", 50)
        AddRecord(dic, "ぶどう", "0522", 60)
        MakeSummary(dic)
    End Sub

End Module

--- 実行結果 : "品名, 日付, 金額, 日付, 金額 ..." ---
ぶどう ,0521,60 ,0522,120
みかん ,0521,40 ,0522,100
りんご ,0521,20 ,0522,80

※ わざと「要求とは異なる仕様」になってます。

引用返信 編集キー/
■36119 / inTopicNo.7)  Re[1]: CSVファイルの読み込みについて
□投稿者/ 魔界の仮面弁士 (1079回)-(2009/05/21(Thu) 09:56:39)
No36110 (K さん) に返信
> 日付    ,商品名,売上数量,売上金額
> 20080401,AAAA  ,       1,     150
> 20080401,BBBB  ,       2,     200
> 20080401,CCCC  ,       4,     400
> 20080402,AAAA  ,       2,     300
> 20080402,BBBB  ,       1,     100
> 20080402,CCCC  ,       3,     300
> ・・・以下月末まで

固定長 CSV ですか?
それとも、実際にはスペースは含まれていないのでしょうか?


> 商品名,1日_数量,1日_金額,2日_数量,2日_金額,・・・(同様に月末まで)
> AAAA ,       1,     150,       2,     300,・・・
> BBBB  ,       2,     200,       1,     100,・・・

AAAA の後に全角スペース1つ、
BBBB の後に半角スペース2つ…?


> ですが、どのように集計をすれば良いかがわからないです。

クロス集計をかけてみるとか。

Imports System
Imports System.Text
Imports System.Data.OleDb

Public Class Form1
    Private TargetDirectory As String = "C:\DATA\"
    Private FileName As String = "TEST.CSV"
    Private tbl As DataTable

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Dim q As New StringBuilder()
        q.AppendLine("TRANSFORM SUM(売上{0}) ")
        q.AppendLine("SELECT 商品名 FROM [" & FileName & "]")
        q.AppendLine("WHERE 日付 BETWEEN 20080400 AND 20080499")
        q.AppendLine("GROUP BY 商品名")
        q.AppendLine("PIVOT '{0}_' & RIGHT(日付, 2)")

        Dim c As New OleDbConnectionStringBuilder()
        c.Provider = "Microsoft.Jet.OLEDB.4.0"
        c.DataSource = TargetDirectory
        c.Add("Extended Properties", "Text;HDR=YES;IMEX=1")
        Dim s As String = c.ConnectionString

        Dim t1 As New DataTable()
        Using adp As New OleDbDataAdapter(String.Format(q.ToString(), "数量"), s)
            adp.Fill(t1)
        End Using
        Dim t2 As New DataTable()
        Using adp As New OleDbDataAdapter(String.Format(q.ToString(), "金額"), s)
            adp.Fill(t2)
        End Using
        t1.PrimaryKey = New DataColumn() {t1.Columns("商品名")}
        t2.PrimaryKey = New DataColumn() {t2.Columns("商品名")}
        t1.Merge(t2, False, MissingSchemaAction.AddWithKey)

        tbl = t1
        DataGridView1.DataSource = tbl
    End Sub
End Class

引用返信 編集キー/
■36121 / inTopicNo.8)  Re[2]: CSVファイルの読み込みについて
□投稿者/ K (15回)-(2009/05/21(Thu) 10:01:49)
No36119 (魔界の仮面弁士 さん) に返信
> ■No36110 (K さん) に返信

> 固定長 CSV ですか?
> それとも、実際にはスペースは含まれていないのでしょうか?

すいません、見やすくするためにスペースを付加したので、実際にはスペースは含まれていません。
引用返信 編集キー/
■36122 / inTopicNo.9)  Re[2]: CSVファイルの読み込みについて
□投稿者/ やじゅ (1010回)-(2009/05/21(Thu) 10:24:39)
やじゅ さんの Web サイト
No36119 (魔界の仮面弁士 さん) に返信
> q.AppendLine("TRANSFORM SUM(売上{0}) ")
> q.AppendLine("SELECT 商品名 FROM [" & FileName & "]")
> q.AppendLine("WHERE 日付 BETWEEN 20080400 AND 20080499")
> q.AppendLine("GROUP BY 商品名")
> q.AppendLine("PIVOT '{0}_' & RIGHT(日付, 2)")
>

OLEDBで、こんな方法があるんですね、勉強になりました。

TRANSFORM ステートメント
http://makotowatana.ld.infoseek.co.jp/access/dasqltransform.htm
引用返信 編集キー/
■36138 / inTopicNo.10)  Re[3]: CSVファイルの読み込みについて
□投稿者/ K (16回)-(2009/05/21(Thu) 18:21:02)
みなさんありがとうございました。

参考にさせていただきます
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -