1

以下のコードを使用して、コンマ区切りのCSVファイルを分割しています。正常に動作しますが、ファイル内の一部のレコードには、区切り文字としてコンマが予約されている場合でも、データ内にコンマが含まれています。たとえば、レコードには、ユーザーがカンマを入力した説明テキストが含まれており、私のスクリプトは、レコードが終了するのと同じように解釈します。どうすればそれを乗り越えることができますか?

これが私のCSVファイルの行の例です。行末の空のレコードには、「」で囲まれた文字が含まれていない可能性があることに注意してください。

"1"、 "34353434"、 "Adam"、 "Traxx"、 "343"、"この男は上司です。よろしくお願いします"、 "" ,, ""、 "" ,, "、" "、" 0、、、」

これは私が読んで分割する方法です:

Sub ReadOnlineExample()
Dim line_read As String
Dim tempfilename As String
Dim i As Integer
Dim rows_skipped As Integer
Dim line_split(0 To 125) As String
Dim MortalityRates(0 To 125) As Double

 tempfilename = "C:\MortalityRateTable.csv"
 Dim sr As New System.IO.StreamReader(tempfilename)

'Split the line into individual data
line_split = line_read.Split(",")

'Save the split data into an array
For i = 0 To UBound(line_split)
  MortalityRates(i) = line_split(i)
Next i

End Sub

誰か助けてもらえますか?多分それは私が見ることができない単純な解決策です:-)

4

2 に答える 2

6

適切なCSVパーサーを使用する-ファイルヘルパーは一般的なオプションです。

Microsoftのパーサーもあります-Microsoft.VisualBasic.FileIO名前空間には、TextFieldParser

これらは、問題が発生するまでほとんどの手動ソリューションが考慮しないCSVの微妙な側面を処理します。

于 2012-09-13T18:18:00.783 に答える
0

あなたの例はおそらく正しくありません。
文の後の最後の部分は言う:"",,"","",,","","0",,"

2つの基本条件があります。

  1. 区切り文字マークは、enclosintの内部文字列全体を呼び出して、マークを引用します(がありx,y、区切り文字がコンマの場合、CSVでは次のようになります"x,y"
  2. 引用符は二重引用符としてエスケープされます(They say "Hey!"CSVにある場合は取得します"They say ""Hey!"""

他の文字列は、入力時に保存されます。

そして、このルールで最後の部分を転送することはできません。カンマをセミコロンに変更して、Excelにインポートしてみてください。Excelは、例を次のように表示します。

ここに画像の説明を入力してください

私の国では、標準のCSV区切り文字のセミコロンがあります。
CSVを解析するためにこのコードを記述します。目的に合わせて変更してみることができます(区切り文字は可変です)。

    public List<string> ParseCsvRow(char delimiter, string input)
    {
        List<string> result = new List<string>();
        string step = "";
        bool escaped = false;
        StringBuilder stringBuilder = new StringBuilder();
        int position = -1;

        do
        {
            if (++position >= input.Length)
            {
                result.Add(stringBuilder.ToString());
                stringBuilder = null;
                break;
            }
            step = input.Substring(position, 1);
            switch (step)
            {
                case "\"":
                    if (stringBuilder.Length == 0 && !escaped)
                    {
                        escaped = true;
                        continue;
                    }
                    if (position + 1 < input.Length)
                        step = input.Substring(++position, 1);
                    else
                        step = "";
                    if (step == "\"")
                    {
                        stringBuilder.Append("\"");
                        continue;
                    }
                    if (step.Equals(delimiter.ToString()) && escaped)
                    {
                        result.Add(stringBuilder.ToString());
                        stringBuilder.Clear();
                        escaped = false;
                        continue;
                    }
                    break;
                default:
                    if (step.Equals(delimiter.ToString()) && !escaped)
                    {
                        result.Add(stringBuilder.ToString());
                        stringBuilder.Clear();
                        continue;
                    }
                    stringBuilder.Append(step);
                    continue;
            }
        } while (true);
        return result;
    }
于 2013-05-14T16:28:31.813 に答える