1

別のアプリに簡単にインポートできるようにするために、15 個の txt ファイルの 4 セットを 4 つの大きな txt ファイルに書き込もうとしています。

これが私のコードです:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AggregateMultipleFiles
{
    class AggMultiFilestoOneFile
    {/*This program can reduce multiple input files and grouping results into one file for easier app loading.*/
    static void Main(string[] args)
    {

        TextWriter writer = new StreamWriter("G:/user/data/yr2009/fy09_filtered.txt");  
        int linelen =495; 
        char[] buf = new char[linelen];
        int line_num = 1;

        for (int i = 1; i <= 15; i++)
        {
                TextReader reader = File.OpenText("G:/user/data/yr2009/fy09_filtered"+i+".txt"); 
            while (true)
            {
                int nin = reader.Read(buf, 0, buf.Length);
                if (nin == 0 )
                {
                    Console.WriteLine("File ended");
                    break;
                }
                writer.Write(new String(buf));

                line_num++;
            }
            reader.Close();

        }
        Console.WriteLine("done");
        Console.WriteLine(DateTime.Now);
        Console.ReadLine(); 
        writer.Close();

    }
  }
}

私の問題は、ファイルの終わりを呼び出すことのどこかにあります。ファイルの最終行の書き込みが完了せず、前のファイルの最終行の途中から次のファイルの最初の行の書き込みを開始します。

これにより、インポート先のアプリ内のすべての列とデータが破棄されます。

おそらく、15 個のファイルそれぞれの各行の末尾にキャリッジとライン リターン \r\n を埋め込む必要があるのではないかと誰かが提案しました。

  1. 持っているものが機能しないのはなぜですか?
  2. 代わりにパディングが機能しますか?どのように私はそれを書くでしょうか?

ありがとうございました!

4

1 に答える 1

4

これが問題だと強く思います:

writer.Write(new String(buf));

最初の文字だけでなく、常にすべてから文字列を作成しています。いずれかのファイルが短い場合、一部のアプリで文字列ターミネータとして表示される「null」Unicode 文字 (つまり、U+0000) になる可能性があります。bufnin

文字列を作成する必要さえありません - 使用するだけです:

writer.Write(buf, 0, nin);

using(ちなみに、手動で を呼び出す代わりに、ステートメントを使用することも強くお勧めしCloseます。)

一度に 1 行ずつ読んでいることを保証するものは何もないことにも注意してください。潜在的に少ないチャンクでファイルを読み取るために、バッファ サイズを 32K 程度に増やすこともできます。

さらに、ファイルが十分に小さい場合は、各ファイルを完全にメモリに読み込むことができます。これにより、コードが単純になります。

using (var writer = File.CreateText("G:/user/data/yr2009/fy09_filtered.txt"))
{
    for (int i = 1; i <= 15; i++)
    {
        string inputName = "G:/user/data/yr2009/fy09_filtered" + i + ".txt";
        writer.Write(File.ReadAllText(inputName));
    }
}
于 2013-02-19T16:49:31.063 に答える