1

C# で区切られた .txt ファイルをフォーマットするのに助けが必要です。ディレクトリ リストを含むテキスト ファイルがあり、メモ帳またはウルトラ エディットで開くと次のようになります。最初の列は日付と時刻、次の列はファイルのサイズ (バイト単位)、3 番目の列はユーザ​​ー名、4 番目の列はファイルの名前です。各列は 1 つ以上のスペースで区切られており、最後のファイル名列にはファイル名にスペースを含めることができます。それらはより多くのディレクトリで構成され、ファイル内の総行数は約 200,000 です。

 V:\word の
ディレクトリ 01/10/2013 12:30 PM 23,000 BUILTIN/ADMINISTRATOR FILE NAME.XLS 10/25/2013
10:39 AM 1,332,432 AMERICAS/DOEJ FILENAME2.CSV
11/31/2000 09:54 PM 21,999,999 AMERICAS /DOEF F_I_L_E_N_A_M_E_4.PDF
 Directory of V:​​\word\administrators
01/10/2013 12:30 PM 23,000 BUILTIN/ADMINISTRATOR FILENAME.XLS
10/25/2013 10:39 AM 1,332,432 AMERICAS/DOEJ FILENAME2.CSV
11/31/200 09:54 PM 21,999,999 南北アメリカ/DOEF F_I_L_E_N_A_M_E_4.PDF

私の目標は、ディレクトリのパス (例: V:\Word またはその他のディレクトリ) をファイル名の末尾に固定形式で追加することです。したがって、「Directory V:\word」が表示されたら、新しいディレクトリまでのすべての行で、ファイル名の末尾にそのパスが表示されるはずです。これは 5 番目の列と見なされます。

ここにいくつかのコードがありますが、まだ助けが必要です。ファイルの最後に V:\word を取得できますが、新しいディレクトリを読み取って、それを後続のすべての行の行末に追加するにはどうすればよいですか?

private void button1_Click(object sender, EventArgs e)
    {
        var sbText = new StringBuilder(10000);

        string currLine = " Directory of V:\\word ";

        try
        {
            using (StreamReader Reader = new StreamReader(@"C:\V.txt"))
            {
                while (!Reader.EndOfStream)
                {

                    if (currLine != " Directory of V:\\word ")
                    {
                        MessageBox.Show("No Directory");

                    }
                    else
                    {                            
                        sbText.AppendLine(Reader.ReadLine() + "V:\\word");
                    }


                }
                // When all of the data has been loaded, write it to the text box in one fell swoop
                richTextBox1.Text = sbText.ToString();

                using (StreamWriter Writer = new StreamWriter(@"C:\NEWFILE.txt"))
                {
                    Writer.WriteLine(sbText);
                }

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("An error has occured. " + ex.Message);
        }
4

2 に答える 2

3

これはかなり単純なアプローチです。これは、データを表す単純なクラスを定義し、各行をクラス インスタンスに解析します。これは効率的で、結果を新しいファイルに簡単に書き込んだり、クエリしたり、表示したりできます。

void Main()
{
  var lines = ReadFile();

  lines.ToList().ForEach (Console.WriteLine);
}

IEnumerable<Line> ReadFile()
{
  using (var reader = new StreamReader(File.OpenRead(@"file.txt")))
  {
    const string directoryPrefix = " Directory of ";
    Regex splittingRegex = new Regex(@"\s+", RegexOptions.Compiled);
    string directory = null;
    string line;

    while ((line = reader.ReadLine()) != null)
    {
      line = line.TrimEnd();
      if (line.StartsWith(directoryPrefix))
      {
        directory = line.Substring(directoryPrefix.Length);
        continue;
      }

      // The "6" parameter means the regex will split the string into 6 parts at most--leaving the last column (filename) unsplit
      var lineParts = splittingRegex.Split(line, 6);
      yield return new Line{ Date = lineParts[0], Time = lineParts[1], Period = lineParts[2], Bytes = lineParts[3], User = lineParts[4], Filename = Path.Combine(directory, lineParts[5]) };
     }
  }
}

// Define other methods and classes here
class Line
{
  public string Date{get;set;}
  public string Time {get;set;}
  public string Period {get;set;}
  public string Bytes {get;set;}
  public string User {get;set;}
  public string Filename {get;set;}  
}

注:これは、単純なテキスト ファイルを解析するためのいくつかのヘルパー メソッドから派生したものです。私の以前のリビジョンの 1 つには、ヘルパー メソッドが含まれていdirectoryます。

于 2013-08-27T18:03:49.603 に答える