Как разбить текстовый файл на количество других текстовых файлов? - PullRequest
0 голосов
/ 13 декабря 2011

Я хочу создать приложение Windows Forms в Visual Studio, которое записывает текстовые файлы одним нажатием кнопки.

У меня есть текстовый файл (например, test.txt), который содержит

AAAA
BBBB
CCCC
DDDD
EOS
FFFF
GGGG
HHHH
IIII
EOS
JJJJ
KKKK
LLLL
MMMM
NNNN
EOS
EOF

Тогда я бы хотел разделить его на ряд других текстовых файлов

**bag1.txt**
AAAA
BBBB
CCCC
DDDD
EOS

**bag2.txt**
EEEE
FFFF
GGGG
IIII
EOS

**bag3.txt**
JJJJ
KKKK
LLLL
MMMM
NNNN
EOS
EOF

Я написал следующий код, но он читает только исходный файл до первого EOS:

private void filterbtn_Click(object sender, EventArgs e)
{
    List<string> strFind = new List<string>();
    using (StreamReader sr = new StreamReader(textBox1.Text))
    {
        string strIndex;
        while((strIndex = sr.ReadLine()) != null)
        {
            strFind.Add(strIndex);
            if (strIndex.Contains("EOS"))
            {
                break;
            }
        }
    }

    using (StreamWriter sw = new StreamWriter(@"D:\Program-program\tesfile\bag1.txt"))
    {
        foreach(string s in strFind)
        {
            sw.WriteLine(s);
        }

        sw.Close();
    }
}

Может кто-нибудь сказать, что не так с кодом?

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Если вы всегда используете EOS и конец каждого строкового поля попробуйте что-то вроде этого:

string s = The input text from test.txt

string[] bags = s.Split(new string[] {"EOS"}, StringSplitOptions.None);

// This will give you an array of strings (minus the EOS field)
// Then write the files...

System.IO.File.WriteAllText(bag1 path, bags[0] + "EOS");  < -- Add this you need the EOS at the end field the field

System.IO.File.WriteAllText(bag2 path, bags[1]);

System.IO.File.WriteAllText(bag3 path, bags[3]);

or somthing more efficient like...

foreach(string bag in bags)
{
  ... write the bag file here
}
0 голосов
/ 17 декабря 2013

Ниже приведены желаемые результаты. Вероятно, не самый оптимизированный код, но он должен направить вас в правильном направлении.

static void Test()
{                       
    var allLines = File.ReadAllLines("test.txt");

    int controller = 0;
    var buffer = new List<string[]>();

    foreach (string line in allLines)
    {
        string path = (controller == 0) 
            ? "bag1.txt" : (controller == 1) 
                             ? "bag2.txt" : "bag3.txt";

        buffer.Add(new string[] { path, line });
        if (line == "EOS") { controller++; }
    }

    var fileNames = (from b in buffer select b[0]).Distinct();

    foreach (string file in fileNames)
    {
        File.WriteAllLines(file, (from b in buffer where b[0] == file select b[1]).ToArray());
    }
}

Надеюсь, это поможет!

0 голосов
/ 13 декабря 2011

Я думаю, у вас есть опечатка:

string FindEOF = strFind.Find(p => p == "EOS");

должно быть

string FindEOF = strFind.Find(p => p == "EOF");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...