ファイル処理

タグの編集
投稿者 かつ  (社会人) 投稿日時 2018/5/23 17:24:05
初級講座 >第30回 ファイル処理>■リスト6で
郵便番号と住所をリストボックスに表示しますが、
Items = Line.Split(",") で
Itemsに一行ずつ '一行を, (カンマ)で区切って項目ごとに分解しますが、
Itemsを2次元変数にして読み込むすべての行を, (カンマ)で区切りでItemsに読み込みたいです。
簡単な方法をどたな様か教えて頂けませんでしょうか。

1行目はItems(1,)
2行目はItems(2,)
のようにItems()の中に読み込みたいです。

↓以下■リスト6↓
Dim Reader As New IO.StreamReader("C:\19yamana.csv", System.Text.Encoding.GetEncoding("Shift-JIS"))
Dim Items() As String                 'CSVの各項目を表す配列
Dim Line As String = Reader.ReadLine 'CSVの一行
Dim PostalCode As String             '郵便番号
Dim Address As String                 '住所
 Do Until IsNothing(Line)

    Items = Line.Split(",")                   '一行を, (カンマ)で区切って項目ごとに分解

    PostalCode = Items(2)                     '郵便番号取得
    PostalCode = PostalCode.Replace("""", "")  '郵便番号から" を省く

    Address = Items(6) & Items(7) & Items(8)   '都道府県名と市区町村名と町域名を結合
    Address = Address.Replace("""", "")        '上記から" を省く

    ListBox1.Items.Add(PostalCode & " - " & Address)

    Line = Reader.ReadLine                    '次の行を読み込む。

Loop

Reader.Close()
投稿者 YuO  (社会人) 投稿日時 2018/5/23 21:39:57
Itemsの型をList(Of String())とかにすればよいのではないかと。
Itemsへの代入はItems.Addになりますが。
投稿者 (削除されました)  () 投稿日時 2018/5/24 03:59:32
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/24 07:39:44
> 初級講座 >第30回 ファイル処理>■リスト6で
下記のことですね。まだ「郵政公社」だった当時のままなので、
csv のダウンロードリンクが違っていたりもしますが。
http://rucio.a.la9.jp/main/dotnet/shokyu/standard30.htm


> 郵便番号と住所をリストボックスに表示しますが、
郵便番号CSVは、複数行で 1 エントリとみなすレコード構成(例:409-1321)もあるので、
まともに扱おうとすると、単純に取り込めるものではなかったりします。

学習目的ではなく、実際にデータとしての利用を考えている場合には、
zipcloud さんあたりの加工済みデータの方が扱いやすいかもしれません。
http://d.hatena.ne.jp/dayflower/20100929/1285744153
https://qiita.com/nanasess/items/0f0aeaa1f72f599b9142


それはさておき。

> 1行目はItems(1,)
> 2行目はItems(2,)
Items(0, ) は未使用ということでしょうか。
それとも列名を格納するための物でしょうか。
ひとまず後者の意味で実装してみてました。
Private Items(,) As String
Private ReadOnly colNames() As String = "市町村CD,旧郵便番号,郵便番号,都道府県カナ,市区町村カナ,町域カナ,都道府県名,市区町村名,町域名,分割町域,小字起番,丁目含有,複数町域,更新区分,変更理由".Split(","c)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim filePath As String = "C:\19YAMANA.CSV"

    Dim q = (From line In System.IO.File.ReadLines(filePath, _
             System.Text.Encoding.GetEncoding("Shift_JIS"))
             Select line.Replace("""""").Split(","c)).ToArray()

    ReDim Items(q.Length, UBound(colNames))
    For colIdx = 0 To UBound(colNames)
        Items(0, colIdx) = colNames(colIdx)
    Next
    For rowNum = 1 To q.Length
        Dim cols() As String = q(rowNum - 1)
        For colIdx = 0 To UBound(colNames)
            Items(rowNum, colIdx) = cols(colIdx)
        Next
    Next
End Sub
投稿者 かつ  (社会人) 投稿日時 2018/5/24 16:07:50
魔界の仮面弁士様

早速実装してみたところ、きちんと動作しました。

2次元の変数を使って、制御プログラムを作っています。

まだ.NETをやってみて慣れていないので理解が難しい所が多いですが、

ご丁寧なアドバイスありがとうございました。