2016-04-19 5 views
0

もう一度もう一度質問に答えます。今回は、テキストファイルの編集に関することです。これは私がこれはそれを行うための最も効率的な方法であればそれほどわからないけれども、私は、これまで持っているものである同時にテキスト入力を読み書きする効率的な方法はありますか?

Write a program that reads the contents of a text file and inserts the line numbers at the beginning of each line, then rewrites the file contents.

に従ってマイホームの仕事です。私は瞬間にテキストファイルを扱うことを学び始めました。

 static void Main(string[] args) 
    { 
     string fileName = @"C:\Users\Nate\Documents\Visual Studio 2015\Projects\Chapter 15\Chapter 15 Question 3\Chapter 15 Question 3\TextFile1.txt"; 
     StreamReader reader = new StreamReader(fileName); 

     int lineCounter = 0; 
     List<string> list = new List<string>(); 

     using (reader) 
     { 
      string line = reader.ReadLine(); 
      while (line != null) 
      { 
       list.Add("line " + (lineCounter + 1) + ": " + line); 
       line = reader.ReadLine(); 
       lineCounter++; 
      } 
     } 

     StreamWriter writer = new StreamWriter(fileName); 
     using (writer) 
     { 
      foreach (string line in list) 
      { 
       writer.WriteLine(line); 
      } 
     } 
    } 

ご支援いただければ幸いです!もう一度感謝します。 :]

+0

本当にループが2回効率的だと思いますか? – Paparazzi

+1

メモリを少なくするために 'StreamReader'を使って行うことができます。後で元のファイルが削除されている間に名前が変更されたdiffentファイルに書き込みます。 – Codor

+0

@Codorそれは実際に素晴らしいアイデアのように聞こえる!私は別のファイルに書き込んでその名前を前のファイルの名前に変更することは考えていませんでした。入力いただきありがとうございます! – Nate

答えて

1

、内容を読み取るためにFile.ReadLinesを使用しています。

// Read all lines and apply format 
var formatteLines = File 
    .ReadLines("filepath") // read lines 
    .Select((line, i) => string.Format("line {0} :{1} ", line, i+1)); // format each line. 

// write formatted lines to either to the new file or override previous file. 
File.WriteAllLines("outputfilepath", formatteLines); 
+0

私たちは実際にLinqについてまだ学習を始めていません。だから私は何か別のものを考えなければならなかった。 Linqを使用することで、多くのデータをよりシンプルにすることができます。当然のうちにHehe – Nate

+0

このメモは、ファイル全体を2回ループしています(すべてのエントリーと同じです)。 ReadLine関数とWriteAllLines関数に隠されているだけです。この答えは、Ninoによるものと同等であり、Linqコードとほぼ同じコードが得られます。 –

2

これは(場合には、ファイルが比較的小さい)十分なはずです:

using System.IO;  
(...) 

static void Main(string[] args) 
{ 

    string fileName = @"C:\Users\Nate\Documents\Visual Studio 2015\Projects\Chapter 15\Chapter 15 Question 3\Chapter 15 Question 3\TextFile1.txt"; 
    string[] lines = File.ReadAllLines(fileName); 

    for (int i = 0; i< lines.Length; i++) 
    { 
     lines[i] = string.Format("{0} {1}", i + 1, lines[i]); 
    } 
    File.WriteAllLines(fileName, lines); 
} 
0

ここだけで一つのループ。私はそれが効率的だと思う。私はLinqを使用することをお勧め

class Program 
{ 
    public static void Main() 
    { 
     string path = Directory.GetCurrentDirectory() + @"\MyText.txt"; 

     StreamReader sr1 = File.OpenText(path); 


     string s = ""; 
     int counter = 1; 
     StringBuilder sb = new StringBuilder(); 

     while ((s = sr1.ReadLine()) != null) 
     { 
      var lineOutput = counter++ + " " + s; 
      Console.WriteLine(lineOutput); 

      sb.Append(lineOutput); 
     } 


     sr1.Close(); 
     Console.WriteLine(); 
     StreamWriter sw1 = File.AppendText(path); 
     sw1.Write(sb); 

     sw1.Close(); 

    } 
+0

これはうまくいきません。まず、元のファイルの最後に数えられた行が追加されます。次に、添付されたテキストは1行に収められています。投稿する前にあなたの "解決策"をチェックしてください。 'sb.AppendLine(lineOutput)'と 'File.WriteAllText(path)'を使用してください – Nino

関連する問題