tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル構造体をCSVへ出力の件
記事No11617
投稿日: 2016/01/30(Sat) 22:57
投稿者トミー
こんばんは。
VB2005〜2013以降様々な環境を使っています。
OSはVista〜Win8.1などです。

構造体に格納されているすべての値をCSVに出力する際、
構造体の項目数が仕様変更で変わってもいいように
ソースを直したいのですが・・・

例えば、For Each でできそうな気がしましたが
探しても見つかりませんでした。

CSV出力のところをどのように変えたらいいでしょうか・・・


構造体の項目数が変わっても


    Private St() As StXyz
    Private Structure StXyz
        '↓項目数が変更しても
        Dim colkey As String
        Dim colName As String
        Dim colAddress As String
        Dim colNickname As String
        Dim colMemo As String
        '↑項目数が変更しても
    End Structure
    
    '(中略)
    
    Private sub CSVOutput()
        Dim fileName As String = "csvTest.csv"              '読み出しファイルのパス
        Dim fileName2 As String = "csvTest2.csv"            '書込みファイルのパス
        Dim fileNo As Integer = FreeFile()                  'ファイル番号を取得
        Dim fileNo2 As Integer = FreeFile()                  'ファイル番号を取得
        Dim n As Integer = 0
        Dim m As Integer = 0

        FileOpen(fileNo, fileName, OpenMode.Input)
        Do Until EOF(fileNo)        'ファイルの最後までループ
            ReDim Preserve St(n)
            ' CSV各項目をセット
            Input(fileNo, St(n).colkey)
            Input(fileNo, St(n).colName)
            Input(fileNo, St(n).colAddress)
            Input(fileNo, St(n).colNickname)
            Input(fileNo, St(n).colMemo)
            'カウンタ追加
            n += 1
        Loop
        FileClose(fileNo)
        
        '(中略)St(n).colkey などを変換処理して違う値が代入されたとする
        
        'ファイルを出力モードで開く
        FileOpen(fileNo2, fileName2, OpenMode.Output)
        Do while m < n
            ' CSV各項目をセット
            '↓ここをどう変えれば良いか判らないです
            Write(fileNo2, St(m).colkey)        'ファイルへ書き込む
            Write(fileNo2, St(m).colName)
            Write(fileNo2, St(m).colAddress)
            Write(fileNo2, St(m).colNickname)
            WriteLine(fileNo2, St(m).colMemo)   '最後の列はWriteLineで書き込む
            '↑ここをどう変えれば良いか判らないです
            'カウンタ追加
            m += 1
        Loop
        FileClose(fileNo2)   'ファイルを閉じる
   End Sub


よろしくご教示お願いいたします。

[ツリー表示へ]
タイトルRe: 構造体をCSVへ出力の件
記事No11618
投稿日: 2016/02/01(Mon) 16:52
投稿者shu
構造体を提示された状態で定義した場合、希望の実装は困難かと思います。

各項目の値をString配列とかList(Of String)などで格納するようにして
おけばループさせることが可能なので実装しやすくなるかと思います。

構造体 実装例)
    Public Structure StXyz
        Public Enum Column
            Key
            Name
            Address
            NickName
            Memo
            Count
        End Enum

        Private _Initialized As Boolean
        Private _Values() As String

        Public Sub Init()
            _Values = Enumerable.Range(0, Column.Count).Select(Function(x) "").ToArray()
            _Initialized = True
        End Sub

        Public Property Values() As String()
            Get
                If Not _Initialized Then
                    Init()
                End If
                Return _Values
            End Get
            Set(value() As String)
                _Initialized = True
                Dim CopyValue = value
                _Values = Enumerable.Range(0, Column.Count).Select(
                           Function(x) If(x < CopyValue.Length, CopyValue(x), "")).ToArray()
            End Set
        End Property

        Public Property Key As String
            Get
                Return Values(Column.Key)
            End Get
            Set(value As String)
                Values(Column.Key) = value
            End Set
        End Property

        Public Property Name As String
            Get
                Return Values(Column.Name)
            End Get
            Set(value As String)
                Values(Column.Name) = value
            End Set
        End Property
・・・
各メンバ分プロパティ化
・・・

    End Structure


使い方:
        '--- 実装例だとInitを呼ばないと各値への設定不可、プロパティの中でInitするような仕組み
        '--- にすれば使うときに省略することも可
        Dim a As New StXyz()
        a.Init()
        a.Key = "key1"
        a.Name = "Name1"

        '--- 文字列配列により各値を渡すことが出来る
        Dim b As New StXyz()
        b.Values = {"key2", "name2", "Address2", "NickName2", "Memo2"}

        '--- メンバ数が不足している配列を渡した場合、後ろのメンバは空文字列が設定される
        Dim c As New StXyz()
        c.Values = {"key3", "Name3"}


a,b,c共Valuesにより順番に項目値にアクセスが可能なので希望の処理が可能かと思います。

[ツリー表示へ]
タイトルRe^2: 構造体をCSVへ出力の件
記事No11621
投稿日: 2016/02/02(Tue) 22:19
投稿者トミー
shuさま

ご回答ありがとうございます。
また実際やってみて改めてお礼を申し上げます。

ありがとうございます。

[ツリー表示へ]