1

私はシステム管理者であり、開発に少ししか触れていないことを前置きさせてください。これがスタックオーバーフローに関する質問でない場合は、お気軽に移動/削除/正しい方向に向けてください。

私がやろうとしているのは、RFC4180準拠の csv ファイルを読み込んで、各値を配列にスローして、スクリプトをさらに処理することです。以下は、私が思いつくことができる最も複雑ではあるが準拠している csv 行であり、機能しますが、このスクリプトは顧客向けになるため、ロジックを確認してテストし、その部分を示していただければ幸いです。私は物事を逃した。

可能であれば、ベストプラクティスのポインタも欲しいです。

これは抜粋です。基本的には CSV ファイルから 1 行を読み取り、RFC 4180 の理解に基づいてさまざまなことをテストおよび適用しながら、各文字を反復処理します。chr(34) は二重引用符 (") を表します。これが唯一の方法です。 VBScript で比較を行うことができました。

If isFirstChar = True And thisChar = chr(34) Then
    'Mark it as in quotes, but don't print it, as it's not part of the text meant for the din file
    isInQuotes = True
    isFirstChar = False
ElseIf thisChar = chr(34) And isInQuotes = True Then
    If nextChar = chr(34) Then
    'Per RFC4108, "" is an escape sequence
    'Print it, jump up the old CharCounter to prevent double handling.
        CharCounter = CharCounter +1
        FieldData = FieldData & thisChar
        isFirstChar = False
    ElseIf nextChar = "," Then
    'It's the end of the field, we can set the isInQuotes to false so that the next char is handled as end of field
    isInQuotes = False
    isFirstChar = False
    Else
    'CSV isn't RFC4180 compliant
    WScript.Echo "This CSV isn't RFC4180 compliant, please fix the file or contact <redacted> for assistance."
    End If
ElseIf thisChar = "," Then
    If isInQuotes = False Then
    'End of Field, handle appropriately
        FieldCounter = FieldCounter + 1
        Redim Preserve FieldArray(FieldCounter)
        FieldArray(FieldCounter) = FieldData
        FieldData = ""
        isFirstChar = True
    Else
    'In quotes, handle as regular char
    FieldData = FieldData & thisChar
    isFirstChar = False
    End If
Else
    'Got all the way here, it's just a regular character! (We hope)
    FieldData = FieldData & thisChar
    isFirstChar = False
End If

以下は、CSV レコードの行の例です。

"Luke ,, Pearson","Luke ""Lucky""","""111 ""Brown Mountain Cres",,"CO""OROY",QLD,4563,,1234567,1,1.11,N,AT FRONT GATE,0712345678,0.0022,2
4

0 に答える 0