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