2017-02-27 25 views
0
から始まる

私は書式設定で私を許しています... 私はFile.ReadLines()を使って読み込んだテキストファイルを持っています。リスト。 "Student"で始まる文字列の最初のインスタンスを探したいと思っています。次に、リスト内のすべての文字列を、 "Student"で始まりその直前で停止する文字列の次のインスタンスに取得したいとします。それらの文字列をサブリストにコピーしてから、すすぎ、ファイルの終わりに達するまで繰り返します。テキストファイルの文字列に基づいて文字列のリストからサブリストを作成

例:

ライン上で何かの行に1つの

何か2

学生 ...:ジョー・スミス

Idを... :12345

主な...:複数行

学生の数学

未知数...:ジェーン・スミス

イド...:54321

主な...:看護

複数行

学生 ...:ジョン・ドウ

イド...:11223

主要:解剖

一層のライン。

私はこのように見えるように学生一人当たりの行のリストが欲しい:

学生1人の

学生...:ジョー・スミス

イド...:12345

メジャー...数学

不明な行数

学生2

学生...:ジェーン・スミス

イド...:54321

主な...:看護

より多くの行が

私はラインを反復するためのforeachを使用しました。各行は新しいリストに追加されます。 "Student"で始まる文字列を見つけたら、新しい生徒オブジェクトを作成し、その行をサブリストに格納します。次に、私はサブリストをクリアしてから、foreachを続けて、新しい生徒オブジェクトを作成します。

最新号 私は最後の生徒が恋しいです。現在の行がリストの最後の行であるかどうかを調べるために現在の行が "Student"で始まるかどうかを調べるif文を持つことができることは分かっていますが、これを行うためのより速く/速い方法が必要です。
& &行を追加する必要があります.Count> 3は、スキップしたい "Student"の最初のインスタンスの前にいくつかの行があるためです。

Linqの例をお待ちしております。

List<Student> students = new List<Student>(); 
List<string> lines = File.ReadLines(args[0]).ToList(); 
List<string> student_lines = new List<string>(); 
foreach(string line in lines) 
{ 
    if(line.StartsWith("Student...", StringComparison.OrdinalIgnoreCase) && lines.Count > 3) 
    { 
     students.Add(new Student(student_lines)); 
     student_lines.Clear(); 
    } 
    lines.Add(line) 
} 
+0

ような何か:私はこれを取得あなたのサンプルデータから

var results = lines .Aggregate(new[] { new List<string>() }.ToList(), (a, x) => { if (x.StartsWith("Student")) { a.Add(new List<string>()); } a.Last().Add(x); return a; }) .Skip(1) .Select(x => new Student(x)) .ToList(); 

を"Student"を開き、\ r \ nで分割します。 – Slai

+0

分割で詳しく説明できますか「学生」について? – user1546185

答えて

1

このお試しください:上の分割、

result

+0

これは私が探しているものです。私はしばらくの間C#のループから外れているので、ここですべてが何が起こっているかを見てみましょう。入力いただきありがとうございます! – user1546185

+0

すばらしい作品!これはまさに私が望んでいたものです。よく働く! – user1546185

-1

あなたがやろうとしているものは本当に漠然とですが、ここで私はあなたがやっていると思うものの非常に基本的な例です。

ここでは、fileNameパラメータを変更するだけです。一言で言えば、すべてのこの小さなプログラムで

static void Main(string[] args) 
{ 
    string line = null; 
    Student student = null; 
    IList<Student> students = new List<Student>(); 
    using (var fileReader = new StreamReader(fileName)) 
    { 
     while ((line = fileReader.ReadLine()) != null) 
     { 
      if (string.IsNullOrWhiteSpace(line)) 
       continue; //continue execution on extra lines 
      if(line.StartsWith("Student...", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       student = new Student(); 
       students.Add(student); 
      } 

      if (student != null) 
       student.Lines.Add(line); 


     } 

     fileReader.Close(); 
    } 
} 

class Student 
{ 
    public IList<string> Lines { get; } = new List<string>(); 
} 

しているが、ファイルが完全に読み込まれたときのノートwhile ((line = fileReader.ReadLine()) != null)は、ファイルまたはnullで次の行にlineの値を設定します(行毎にファイルの読み込みを開始。

それが空行をチェックする次の(私たちは空行を気にいけないので、我々は上に移動)

私たちは、その後、今、私たちは私たちは大文字と小文字を区別を比較することができStringComparison.CurrentCultureIgnoreCaseを使用しているline startsith Student...かどうかを確認します。

これが学生向けの場合は、新しい学生を作成し、 studentsコレクションに追加します。

最後にstudentがヌルでない限り、lineの内容を学生の.Linesプロパティに追加できます。

+0

なぜdownvoteがわからないのですか?情報をありがとう。私はこの方法ではじまったが、入力テキストファイルがそれほど大きくない(100k行であってもよい)と、ReadLines()関数が私が使いたいものであると判断した。 – user1546185

0

File.ReadAllText` `に簡単にこの

if (args.Length < 1) return;    // optional check if any args 

string text = File.ReadAllText(args[0]); 

string[] parts = text.Split(new[] { "Student" }, 0); 

string[][] lines = Array.ConvertAll(parts, part => part.Split(new[] { '\r', '\n' }, 1)); 

Debug.Print(lines[1][1]);  // "Id...: 12345" 
関連する問題