1

この特定のシナリオに関連する質問/解決策をWeb全体で見つけることができないように思われるので、StreamReaderタイプを使用して達成しようとしていることの内訳を示したいと思いました。

基本的に、行数が不均衡な2つのファイルがあります。つまり、data1.txtには20行が含まれ、data2.txtには10行が含まれているため、StreamReaderを使用して最初に両方の.txtファイルからデータを読み取り、しばらくの間使用できると考えていました。 (((ts.transaction = t.ReadLine())!= null)||((ms.master = t.ReadLine())!= null))両方のファイルから合計行を読み取ると、続行できます追加のロジックを適用して、データを3番目のファイルにマージします。

しかし、以下を実行すると、おそらく行数が不均衡であるために、「オブジェクトのインスタンスに設定されていないオブジェクト参照」が発生しますか?「||」を置き換えるとうまくいくようです 「&&」を含むwhileステートメントでは、両方のファイルから合計行数を出力できません。

現時点では、データ出力をテストするために、richTextBox1にテキストを追加しています。OR句を使用するより良い方法があるかどうか、または正しい方法で条件付けしながらこれを実行するかどうかを確認していました。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //Read Transaction File
    private void button1_Click(object sender, EventArgs e)
    {
        richTextBox1.Clear();
        StreamReader t = new StreamReader(@"c:\data1.txt");
        StreamReader m = new StreamReader(@"c:\data2.txt");

        transaction_storage ts = new transaction_storage();
        master_storage ms = new master_storage();

        while (((ts.transaction = t.ReadLine()) !=null)||((ms.master = t.ReadLine()) !=null))
        //while ((ts.transaction = t.ReadLine()) != null)
        {
            ms.m_index = Convert.ToInt32(ms.master.Substring(0, 2));

            ts.t_index = Convert.ToInt32(ts.transaction.Substring(0, 2));
            ts.t_name = ts.transaction.Substring(2, 10);
            ts.t_item = ts.transaction.Substring(10, 17);
            ts.t_amount = Convert.ToDouble(ts.transaction.Substring(ts.transaction.Length -7, 7));
            string transaction_data = (ts.t_index.ToString() + " " + ts.t_name + " " + ts.t_item + " " + ts.t_amount + "\n");
            string master_data = (ms.m_index.ToString());

            richTextBox1.AppendText(transaction_data);
            richTextBox1.AppendText(master_data);
        }

        t.Close();
        m.Close();

    }


    class master_storage
    {
        public int m_index;
        public string master;
    }

    class transaction_storage
    {

        public int t_index;
        public string t_name;
        public string t_item;
        public double t_amount;
        public string transaction;
    }

}

}

4

1 に答える 1

3

最初に両方のファイルを読み込んでから、単純な for ループを使用して後でロジックを実行します。

var linesOfFile1 = File.ReadAllLines(@"c:\data1.txt");
var linesOfFile2 = File.ReadAllLines(@"c:\data2.txt");

for(int i = 0; i < Math.Min(linesOfFile1.Length, linesOfFile2.Length); i++) {
  //...
}
于 2013-03-24T02:11:06.447 に答える