0

C# (VS 2010 Express) を使用して、テキスト ファイルの内容を文字列に読み込みました。文字列はかなり長いですが、タブの場合は「\t」、キャリッジ リターン/改行の場合は「\r\n」で確実に分割されます。

タブはデータの新しい列を示し、新しい行はデータの新しい行を示します。

配列またはディメンションのリスト (X)(Y) を作成して、配列内の各スポットがテキスト ファイルからの 1 行のデータを保持できるようにし、その 1 行に含まれるすべての Y 列 ("\t"はデータの新しい列を意味し、"\r\n" はデータの新しい行を意味します")。

簡単にするために、テキストに 10 行のデータと 2 列があるとします。配列やリスト、またはデータを保存するのに最適だと思われるものを作成したいと思います。どうすればいいですか?ありがとう。

これは、テキスト ファイル内のデータを文字列に読み取るために使用したコードです。

// Read the file as one string.
            System.IO.StreamReader myFile = new System.IO.StreamReader("f:\\data.txt");
            string myString = myFile.ReadToEnd();
4

6 に答える 6

1

TextFieldParserは、テキストベースの区切りファイルを処理するための素晴らしいクラスです。ファイル、区切り文字(この場合は「\ t」)を指定すると、次の値の行を(文字列配列として)取得するメソッドが提供されます。

コメント、引用符で囲まれたフィールド、エスケープされた区切り文字などを処理できるため、一般的なケースよりも利点がありSplitます。このようなケースがある場合とない場合がありますが、これらの厄介なエッジケースをすべて無料で処理できるのはかなり良いことです。

于 2012-08-29T19:39:01.990 に答える
1

そのまま(あなたはすでにすべての文字列を持っています):

str.Split(new string[]{"\r\n"}, StringSplitOptions.None)
  .Select(s => s.Split('\t'));

IEnumerable<string[]>リストのリスト、配列の配列など、適切なToArray()orToList()などが必要なバリアントを生成します。

ただし、各行を一度に1つずつ処理できる場合は、それを可能にする何かを使用したほうがよい場合があります。

public IEnumerable<string[]> ReadTSV(TextReader tr)
{
  using(tr)
    for(string line = tr.ReadLine(); line != null; line = tr.ReadLine())
      yield return line.Split('\t');
}

次に、各行に必要なだけのメモリを使用します。さらに進んで読み取り値を変更し、個々のセルを1つずつ出力することもできますが、通常は、数百MBのサイズのファイルを適切な効率で読み取るのに十分です。

質問へのコメントに基づいて編集します。

あなたが本当にしたいのであれば、あなたはList<string[]>から得ることができます:

var myFile = new StreamReader("f:\\data.txt");
var list = ReadTSV(myFile).ToList();

または、行yield return line.Split('\t');をに変更すると、が表示されyield return line.Split('\t');ますList<List<string>>

ただし、可能であれば、最初に結果をリストに入れるのではなく、結果を直接処理します。

var myFile = new StreamReader("f:\\data.txt");
var chunks = ReadTSV(myFile);
foreach(var chunk in chunks)
{
   DoSometingOnAChunk(chunk[0], chunk[1]);
}

使用するメモリが少なくなり、最初にすべてを読み取るために一時停止するのではなく、より早く開始できます。このようなコードは、文句なしにギガバイトを楽しく処理できます。

于 2012-08-29T19:39:54.903 に答える
1
var result = contents.Split("\r\n".ToArray(), StringSplitOptions.RemoveEmptyEntries).Select(s => {
    s.Split('\t').ToList();
}).ToList();

resultになりますList<List<String>>

于 2012-08-29T19:34:30.453 に答える
1

String.Split

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

于 2012-08-29T19:34:40.267 に答える
1
File.ReadLines(sourceFilePath)
    .Select(line => line.Split('\t'))
    .ToArray();
于 2012-08-29T19:36:12.520 に答える
1

これにより、ファイルが読み取られ、文字列配列のリストが作成されます

List<string[]> rows= File.ReadLines("PathToFile")
    .Select(line=>line.Split('\t')).ToList();

string[][]バージョンが必要な場合は、ToArray();代わりにToList();最後に使用してください。

于 2012-08-29T19:36:16.583 に答える