tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCSVファイルから配列を取得するコード
記事No11079
投稿日: 2013/05/23(Thu) 17:56
投稿者るいがとひなきす
windows7 OS上で実行しているvb2005において以下の様な
CSVファイルから配列を取得するコードを書いてみました。
その際にインターネットで調べた例文を参照しました。
これは動きます。しかし同じようなステートメントが出てきたり
してスッキリ来ないので 不要な部分や統合できる箇所を
教えていただけると幸いです。
例えば 「TextFieldParser」というメソッドを含んだ
ステートメントが2回出てくるのが、気になります。
あち配列に取得した文字列を収める際にも
「Redim preserve」なんていういかにもVB6時代の
遺物みたいなステートメント使ってますが
これもスッキリ書き換える方法をご教示いただけますと
幸いです

**********

Dim csvRecords As New System.Collections.ArrayList()

        'CSVファイル名
        Dim csvFileName As String = "c:\testfile.txt"
        Dim xcol(0) As String
        Dim ycol(0) As String

        'utf-8で読み込む
        Dim tfp As New FileIO.TextFieldParser(csvFileName, _
            System.Text.Encoding.GetEncoding("utf-8"))
        'フィールドが文字で区切られているとする
        'デフォルトでDelimitedなので、必要なし
        tfp.TextFieldType = FileIO.FieldType.Delimited
        '区切り文字を,とする
        tfp.Delimiters = New String() {vbTab}
        'フィールドを"で囲み、改行文字、区切り文字を含めることができるか
        'デフォルトでtrueなので、必要なし
        tfp.HasFieldsEnclosedInQuotes = True
        'フィールドの前後からスペースを削除する
        'デフォルトでtrueなので、必要なし
        tfp.TrimWhiteSpace = True

        While Not tfp.EndOfData
            'フィールドを読み込む
            Dim fields As String() = tfp.ReadFields()
            '保存
            csvRecords.Add(fields)
        End While

        '後始末
        tfp.Close()

        Using textParser As New Microsoft.VisualBasic.FileIO.TextFieldParser("c:\testfile.txt", System.Text.Encoding.GetEncoding("UTF-8"))

            'CSVファイル
            textParser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited

            '区切り文字
            textParser.SetDelimiters(vbTab)

            'ファイルの終端までループ
            While Not textParser.EndOfData
                '1行読み込み
                Dim row As String() = textParser.ReadFields()

                xcol(UBound(xcol)) = row(0)
                ycol(UBound(ycol)) = row(1)

                Console.WriteLine()
                ReDim Preserve xcol(UBound(xcol) + 1)
                ReDim Preserve ycol(UBound(ycol) + 1)
            End While
        End Using
        MsgBox(xcol(0) & ", " & xcol(1) & ", " & xcol(2))
        MsgBox(ycol(0) & ", " & ycol(1) & ", " & ycol(2))

[ツリー表示へ]
タイトルRe: CSVファイルから配列を取得するコード
記事No11080
投稿日: 2013/05/24(Fri) 15:26
投稿者YuO
> 例えば 「TextFieldParser」というメソッドを含んだ
> ステートメントが2回出てくるのが、気になります。

同じファイルを2回読んでいるからですね。
2通りの書き方があるものを,2通りとも書いた,ということはないですか。


> あち配列に取得した文字列を収める際にも
> 「Redim preserve」なんていういかにもVB6時代の
> 遺物みたいなステートメント使ってますが

ArrayListも遺物です。
基本的には,情報を保持するためのクラス or 構造体を作成し,List(Of T)にAddしていきます。
場合によってはSystem.Drawing.Pointが最適な場合もありそうです。

[ツリー表示へ]
タイトルRe^2: CSVファイルから配列を取得するコード
記事No11081
投稿日: 2013/05/24(Fri) 19:34
投稿者るいがとひなきす
ありがとうございました。統合してスッキリさせることについては
以下のように改変することで達成出来ました。しかし
redim preserveをlist.addに書き換えることは成功してません。

       Dim csvRecords As New System.Collections.ArrayList()

        'CSVファイル名
        Dim csvFileName As String = "c:\testfile.txt"
        Dim xcol(0) As String
        Dim ycol(0) As String

        'utf-8で読み込む
        Dim tfp As New FileIO.TextFieldParser(csvFileName, _
            System.Text.Encoding.GetEncoding("utf-8"))
        'フィールドが文字で区切られているとする
        'デフォルトでDelimitedなので、必要なし
        tfp.TextFieldType = FileIO.FieldType.Delimited
        '区切り文字を,とする
        tfp.Delimiters = New String() {vbTab}
        'フィールドを"で囲み、改行文字、区切り文字を含めることができるか
        'デフォルトでtrueなので、必要なし
        tfp.HasFieldsEnclosedInQuotes = True
        'フィールドの前後からスペースを削除する
        'デフォルトでtrueなので、必要なし
        tfp.TrimWhiteSpace = True

        While Not tfp.EndOfData
            'フィールドを読み込む
            Dim fields As String() = tfp.ReadFields()
            '保存
            csvRecords.Add(fields)
            xcol(UBound(xcol)) = fields(0)
            ycol(UBound(ycol)) = fields(1)
            ReDim Preserve xcol(UBound(xcol) + 1)
            ReDim Preserve ycol(UBound(ycol) + 1)
        End While

        '後始末
        tfp.Close()

        MsgBox("X座標達:" & xcol(0) & ", " & xcol(1) & ", " & xcol(2) & " Y座標達:" & ycol(0) & ", " & ycol(1) & ", " & ycol(2))

[ツリー表示へ]
タイトルRe^3: CSVファイルから配列を取得するコード
記事No11082
投稿日: 2013/05/24(Fri) 19:43
投稿者るいがとひなきす
ありがとうございます 自己レスです。

>         Dim xcol(0) As String
>         Dim ycol(0) As String

ここを Dim xcol = New ArrayList()とかにして
>             xcol(UBound(xcol)) = fields(0)
>             ReDim Preserve xcol(UBound(xcol) + 1)
ここをxcol.add(fields(0)) : ycol.add(fields(1))に
してもうまくいきました。
でも、arraylistは過去の遺物というご指摘
があるのでもっとモダンな方法をご教示いただけますと
幸いです。

[ツリー表示へ]
タイトルRe^4: CSVファイルから配列を取得するコード
記事No11083
投稿日: 2013/05/26(Sun) 02:00
投稿者魔界の仮面弁士
> ここを Dim xcol = New ArrayList()とかにして
正確には、Dim xcol As New ArrayList() ですね。

VB2008 以降なら Dim xcol = New ArrayList() でも構いませんが、
VB2005 の場合は Dim xcol As New ArrayList() にする必要があります。

もしくは Dim xcol As ArrayList = New ArrayList() で。


> でも、arraylistは過去の遺物というご指摘
> があるのでもっとモダンな方法をご教示いただけますと

それについては、既に回答があった筈…。

>>> クラス or 構造体を作成し,List(Of T)にAddしていきます。
>>> 場合によってはSystem.Drawing.Point

[ツリー表示へ]
タイトルRe^5: CSVファイルから配列を取得するコード
記事No11084
投稿日: 2013/05/26(Sun) 13:45
投稿者るいがとひなきす
ありがとうございました。

VB6歴は長いのですが、クラスつかってなかったので
これだけの説明では具体的にどういうステートメント
構成してよいやら?関連するサイトをご教示いただけると
幸いです。以下の様なサイトが関連するのですか。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15323&forum=7

> >>> クラス or 構造体を作成し,List(Of T)にAddしていきます。
> >>> 場合によってはSystem.Drawing.Point

[ツリー表示へ]
タイトルRe^6: CSVファイルから配列を取得するコード
記事No11085
投稿日: 2013/05/27(Mon) 10:37
投稿者YuO
とりあえず,@ITの記事

特集C#&VBジェネリック超入門(前編):ジェネリック・クラスで変わるC#とVBのコレクション (1/4) - @IT
http://www.atmarkit.co.jp/ait/articles/0602/11/news011.html

とかでしょうか。
まぁ,古い (2006年) の記事ではあるものの,ほとんどは現在でも基礎として使えると思います。
後編の最後の方について,現在ならConvertAllは今ならSelect拡張メソッドと,必要ならToList拡張メソッドで代用しますし,
コラムのC#の匿名メソッドはC#/VBのラムダ式を使いますが。
# VB 2005だと関係のない話ではありますが。

下手をすると,VB6の知識は動くコードを書けてしまうだけに足を引っ張ります。
VB6とVB.NET/VB.NET 2003とVB 2005は別物と考えて勉強した方がよいと思いますよ。

[ツリー表示へ]
タイトルRe^7: CSVファイルから配列を取得するコード
記事No11086
投稿日: 2013/05/28(Tue) 19:43
投稿者るいがとひなきす
ありがとうございます。
Classを新しく定義した上で
Form1_Loadサブルーチンの中で
その新しく定義した変数を使おうと
思うと私にはできなかったです。
Form1_Loadサブルーチンの中で新しい変数を
定義すれば大丈夫ですが、これだと
あまりモダンとはいえませんね。
CLASSという概念に慣れてませんので
ダメなのでしょうね。

> とりあえず,@ITの記事
>
> 特集C#&VBジェネリック超入門(前編):ジェネリック・クラスで変わるC#とVBのコレクション (1/4) - @IT
> http://www.atmarkit.co.jp/ait/articles/0602/11/news011.html
>
> とかでしょうか。
> まぁ,古い (2006年) の記事ではあるものの,ほとんどは現在でも基礎として使えると思います。
> 後編の最後の方について,現在ならConvertAllは今ならSelect拡張メソッドと,必要ならToList拡張メソッドで代用しますし,
> コラムのC#の匿名メソッドはC#/VBのラムダ式を使いますが。
> # VB 2005だと関係のない話ではありますが。
>
> 下手をすると,VB6の知識は動くコードを書けてしまうだけに足を引っ張ります。
> VB6とVB.NET/VB.NET 2003とVB 2005は別物と考えて勉強した方がよいと思いますよ。

[ツリー表示へ]