1

テキストファイルから読み取ったデータをカンマ区切り形式で別のテキストファイルに書き込もうとしています。その結論に達するためのコードが何であるかを知る必要があります。これは私が助けを必要としているところです。

例:

元のデータは次のようになります。

Agnico -Eagle Mines
COM
008474108
28996843
716800
716800
N / A
N / A

N / A
716800
N / A
Agrium Inc.
COM
008916108
145739616
1646617
1646617
N / A
N / A

N / A
1646617
N / A
AuRico Gold Inc
COM
05155C105
504505
62875
62875
N / A
N / A

N / A
62875
N / A

これは、RichTextBoxでデータをどのように表示するかを示しています。

Agnico-Eagle Mines、COM、008474108,28996843,716800,716800、N / A、N / A ,, N / A、716800、N / A
Agrium Inc.、COM、008916108,145739616,1646617,1646617、N / A 、N / A ,, N / A、1646617、N / A
AuRico Gold Inc、COM、05155C105,504505,62875,62875、N / A、N / A ,, N / A、62875、N / A

元のテキストデータからわかるように、最初の行を読み取り、次にカンマを追加してから2行目を読み取り、最初の行に追加してからカンマを追加します。これは最初の12行に1つになります。12行目の終わりにはコンマがありません。その後、プロセスが最初からやり直します。

どんな情報でも大歓迎です。

ありがとう。

以下は私がこれまでに書いたコードです。

    private void button1_Click(object sender, EventArgs e)
    {
        using (StreamReader Reader = new StreamReader(@"C:\Original_Text_File.txt"))
        {
            while (!Reader.EndOfStream)
            {
                TextBox1.AppendText(Reader.ReadLine());
            }

        }           

    }

    private void button2_Click(object sender, EventArgs e)
    {
        using (StreamWriter Writer = new StreamWriter(@"C:\Original_Text_File.txt"))
        {

            Writer.WriteLine(TextBox1.Text);

        }
    }
4

6 に答える 6

5

入力テキストのマジックナンバーが12であるとすると、

var query = File.ReadLines("a.txt")
                .Select((line,no) => new{line,no})
                .GroupBy(x => x.no/12)
                .Select(g => String.Join(",",g.Select(x => x.line)));

File.WriteAllLines("b.txt",query);

これは、サンプル入力と期待される出力に対して機能します。

于 2012-12-28T22:44:32.303 に答える
5

これは、データの読み取りにアプローチする方法です。

        var sbText = new System.Text.StringBuilder(10000);
        // Keeps track of your current position within a record
        int wCurrLine = 0;
        // Number of rows in the file that constitute a record
        const int LINES_PER_ROW = 12;

        using (StreamReader Reader = new StreamReader(@"C:\Original_Text_File.txt"))
        {
            while (!Reader.EndOfStream)
            {
                // If we are not on the first row in the record, add a comma
                if (wCurrLine != 0)
                {
                    sbText.Append(",");
                }
                // Add the text
                sbText.Append(Reader.ReadLine());

                // Increment our current record row counter
                wCurrLine++;
                // If we have read all of the rows for this record
                if (wCurrLine == LINES_PER_ROW)
                {
                    // Add a line to our buffer
                    sbText.AppendLine();
                    // And reset our record row count
                    wCurrLine = 0;
                }
            }
            // When all of the data has been loaded, write it to the text box in one fell swoop
            TextBox1.Text = sbText.ToString();

編集:元の質問に完全には答えていないことに気付きました.結果を書き出す前に結果を見たい場合を除き、テキストボックスを使用する理由はありません. これを行う必要がない場合は、次の行を置き換えることができます。

            TextBox1.Text = sbText.ToString();

と:

        using (StreamWriter Writer = new StreamWriter(@"C:\Original_Text_File.csv"))
        {
            Writer.Write(sbText);
        }

(ファイル名の拡張子の変更に注意してください)。

于 2012-12-28T22:35:22.763 に答える
1

異なる方法であるファイルから別のファイルに書き込みたいだけの場合は、次のようにしてみてください。

protected string TextProperty { get; set; }

private void button1_Click(object sender, EventArgs e)
{
    using (StreamReader reader = new StreamReader(@"C:\Original_Text_File.txt"))
    {
        // read all content file to the string property on your form.
        TextProperty = reader.ReadToEnd();    
    }         

}

private void button2_Click(object sender, EventArgs e)
{
    using (StreamWriter writer = new StreamWriter(@"C:\Original_Text_File.txt"))
    {
        // write all content of the property to the file.
        writer.Write(TextProperty);    
    }
}

行ごとに分けたり、行ごとに特定の処理をしたい場合は、StringBuilderクラスを使用できます。

private void button1_Click(object sender, EventArgs e)
{
    using (StreamReader reader = new StreamReader(@"C:\Original_Text_File.txt"))
    {
        StringBuilder builder = new StringBuilder();
        while (reader.Peek() >= 0) 
        {
            builder.AppendLine(reader.ReadLine());
        }
    }
}

メソッドのすべてのコンテンツを取得するにはStringBuilder、メソッドを呼び出しToString()てファイルに書き込みます。

private void button2_Click(object sender, EventArgs e)
{
    using (StreamWriter writer = new StreamWriter(@"C:\Original_Text_File.txt"))
    {
        writer.Write(builder.ToString());
    }
}
于 2012-12-28T22:32:15.103 に答える
0
private void button1_Click(object sender, EventArgs e)
{
    using (StreamReader Reader = new StreamReader(@"C:\Original_Text_File.txt"))
    {
        var i = 0;
        while (!Reader.EndOfStream)
        {
            if (i % 12 == 11)
            {
                //every 12 lines you read append new line instead of ,
                TextBox1.AppendText(string.Format("{0}\n", Reader.ReadLine()));
            }
            else
            {
                TextBox1.AppendText(string.Format("{0},", Reader.ReadLine()));
            }
            i++;
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    using (StreamWriter Writer = new StreamWriter(@"C:\Original_Text_File.txt"))
    {
        using (StringReader Reader = new StringReader(TextBox1.Text))
        {
            while (true)
            {                
                var line = Reader.Readline()
                if(line !=null)
                {
                    Writer.WriteLine(Reader.Readline());
                }
                else
                {
                    break;
                }
            }
        }
    }
}
于 2012-12-28T22:57:25.230 に答える
0

注意 - マーカー (空白行) があった場合にこれを行う方法の例としてこれを残しています。書き込んだときにサンプルデータを読み逃しました。


このようなものはうまくいくはずです。私はテストしていないので、タイプミスがあるかもしれません:

注: レコードの最後にいることを知るために、(カウントするのではなく) 空白行を探します。このようにして、別のフィールドを追加しても、コードは壊れません。

    using (StreamReader Reader = new StreamReader(@"C:\Original_Text_File.txt"))
    {
        StringBuilder aLine;
        boolean first = true;

        while (!Reader.EndOfStream)
        {
           // read source line
           string inLine = Reader.ReadLine();

           // if length is zero append to test box (we have a blank line between records)
           if (inLine.Length == 0)
           {
              TextBox1.AppendText(aLine.ToString());
              first = true;
           } 

           // add a comma if we are not the first
           if (!first)
           {
             aLine.Append(",");
           }
           aLine.Append(inLine);

           // next time we won't be first
           first = false;

        }
        TextBox1.AppendText(aLine.ToString());

    }           
于 2012-12-28T22:36:45.447 に答える
0

a を作成しList<String>、各行をその中に読み込みます。次に,、区切り文字として a を使用して String.Join リストを結合します。もちろんClear、各行の先頭でリストのメソッドを呼び出します。

于 2012-12-28T22:30:14.607 に答える