1

全てにおいて良い日、

File Helper を使用した CSV 解析に関して問題があります。私のCSVは次のようになります

,,,026642,0,00336,05,19,"スイカ *",19,"1 ",,,,,,,,0,,001.99.,0,,,,,0,,0,0, ,,,,,,,,,,,,,,,,51,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,026645,0,00338,05,19,"オニオン ",19,"*1",,,,,,,,0,,002.99.,0,,,,,0,,0,0,,,,,,,,,,,,,, ,,,51,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,026687,0,00380,05,19,"マッシュルーム",19,"(ブラックファンガス)",,, ,,,,,0,,021.90.,0,,,,,0,,0,0,,,,,,,,,,,,,,,,51,,,,,,,, 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 、、、、、、、、、

このCSVには116列/フィールドがあります。

問題は、行全体から4つのフィールドしか必要ないことでした。

フィールド 4 = 026687、フィールド 9 = "WATERMELON *"、フィールド 11 = "(BLACK FUNGUS)"、フィールド 21 = 002.99。

インスタンスクラスを作成するための非常に優れたソリューションであるウィザードを使用し、必要のない他のすべてのフィールドの上に FieldValueDiscarded _ を配置すると、CSV 入力と同じように出力されます。

出力に書き込むために必要なフィールドのみを抽出する方法を教えてください。

ありがとうございました

更新:さらに調査した結果、最終的にこのエラーについて明確になりました。このエラーは、クラスが継承されていないために発生するため、特定のフィールドを別のクラスに取得できません。マッピング クラスを継承クラスとして宣言することで、特定のフィールドを取得できます。

ただし、マッピングクラスから継承したクラス内の関数を取得する方法に固執しました。これは私のコードです `Imports System.Text Imports System.IO Imports FileHelpers

Public Class ProcessField : InputCSV を継承

Public Function MyPLUc(ByVal value As Integer)
    Dim PLUc As String
    MyBase.PLU = value
    PLUc = (0 + 0 + value)
    Return (0 + 0 + value)
End Function
Public Function MyStatusc(ByVal value As Integer)
    MyBase.Status = value
    Dim Status As Integer
    If value > 0 Then
        Status = 800
    Else
        Status = 900
    End If
    Return (0 + Status)
End Function
Public Function MyUnitPricec(ByVal value As Integer)
    MyBase.UnitPrice = value
    Dim UP As Integer
    UP = value
    Dim bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(UP)
    Return (0 + 0 + 0 + UP)
End Function
Public Function MyLabelFormat(ByVal value As Integer)
    Return (1 + 1)
End Function
Public Function MyEAN(ByVal value As Integer)
    Return (0 + 6)
End Function
Public Function MyCName(ByVal value As String)
    MyBase.CName1 = value
    Dim hexString As String = Hex(value)
    Return (hexString)
End Function
Public Function MyBCC(ByVal value As String)
    value = (0 + 0)
    Return (0 + 0)

End Function

クラスの終了`

問題は、これらの関数ですべての戻り値を取得する方法です

4

1 に答える 1

2

あなたの質問を理解しているかどうかはわかりませんが、必要以上に複雑にしていると思います。

116 個の文字列フィールドを持つ FileHelpers クラスを作成するだけです。プロパティではなく、(パブリック) フィールドである必要があります。FileHelpers クラスをサブクラス化しないでください。FileHelpers クラスを通常のクラス (つまり、プロパティ、関数など、サブクラス) として使用しないでください。FileHelpers クラスは、CSV 形式のみの「仕様」と考えてください

インポートするには、次のように記述します。

Dim engine As New FileHelperEngine(GetType(RecordSpec)) 

' To Read Use: 
Dim results As RecordSpec() = DirectCast(engine.ReadFile("FileIn.txt"), RecordSpec()) 

次に、の配列がありRecordSpecます。各 RecordSpec には 116 個のフィールドすべてが入力されますが、必要のないフィールドは無視してください。次に、結果をループして、値に対して必要なことを行います。たとえば、インポートされたフィールドをMyProduct、フィールドの代わりにプロパティを使用し、おそらく追加のロジックを使用して、別の (より通常の) クラスにマップする必要がある場合があります。

For Each recordSpec As RecordSpec In results
  Dim myProduct = New MyProduct()
  myProduct.Id = recordSpec.Field4
  myProduct.Name = recordSpec.Field9
  myProduct.Category = recordSpec.Field23
  ' etc.
Next

要約すると、RecordSpecクラスは CSV ファイルの構造を定義するためにのみ使用する必要があります。これを使用して、単純な配列にファイルのすべての値を入力します。次に、値をより有用なクラスにマップしますMyProduct

于 2012-10-15T12:15:42.027 に答える