7

メモリ内のzipファイルからCSVファイルのコンテンツを読み取ります(ディスクに書き込む必要はありません)。次のコードを使用して、人間が読める文字列を取得します

 string  result = Encoding.ASCII.GetString(memoryStream.ToArray());

ただし、CSV ファイルの各行をマップするために、結果を string[] にしたいと考えています。

これを自動的に処理する方法はありますか?

ありがとう

4

3 に答える 3

21

ToArrayまず、メモリ ストリームを呼び出す必要はありません。を使用して、繰り返しStreamReader呼び出します。ReadLine()

memoryStream.Position = 0; // Rewind!
List<string> rows = new List<string>();
// Are you *sure* you want ASCII?
using (var reader = new StreamReader(memoryStream, Encoding.ASCII))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        rows.Add(line);
    }
}
于 2013-03-01T17:44:50.383 に答える
9

メソッドを使用Splitして、文字列を改行で分割できます。

string[] result = Encoding.
                  ASCII.
                  GetString(memoryStream.ToArray()).
                  Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
于 2013-03-01T17:44:14.157 に答える
3

CSV ファイルの内容によっては、これはあなたが信用しているよりもはるかに難しい問題になる可能性があります。

これがあなたのcsvであると仮定します:

id, data1, data2
1, some data, more data
2, 「この要素に
はフィールドの真ん中に新しい行があります」, 行ごとに読んでいると問題が発生する可能性があります

これを単純に reader.ReadLine() を使用して 1 行ずつ読み取ると、途中で引用符で囲まれたフィールドに新しい行が含まれている場合 (これは一般に CSV で許可されています)、目的の結果が得られません。このようなものがもっと必要です

List<String> results = new List<string>();
StringBuilder nextRow = new StringBuilder();
bool inQuote = false;
char nextChar;
while(reader.ReadChar(out nextChar)){ // pretend ReadChar reads a char into nextChar and returns false when it hits EOF
  if(nextChar == '"'){
    inQuote = !inQuote;
  } else if(!inQuote && nextChar == '\n'){
    results.Add(nextRow.ToString());
    nextRow.Length = 0;
  } else{ nextString.Append(nextChar); }
}

これは二重引用符を処理することに注意してください。引用符の欠落は問題になりますが、それらは常に .csv ファイルにあります。

于 2013-03-01T18:39:46.953 に答える