Разбор текста в несколько отдельных файлов в зависимости от содержимого

У меня проблемы с получением последнего файла.

У меня есть текстовый файл с разделителями табуляции, который выглядит следующим образом.

KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W123  RXF 4x25    0000000440  Cable RXF 4x25
PART        01      1   1       
PART        02      2   2       
PART        03      3   3       
PART        04      4   4       
PART        SH      GND GND     
KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W124  RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   5   5       
PART        02  1   6   6       
PART        03  1   7   7       
PART        04  1   8   8       
PART        SH  1   GND GND     
KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W125  RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   9   9       
PART        02  1   10  10      
PART        03  1   11  11      
PART        04  1   12  12      
PART        SH  1   GND GND     

По сути, это строка, начинающаяся с Word KABEL, за которой следует ряд столбцов с разделителями табуляции. За этой строкой следуют несколько строк, начинающихся со слова PART. Количество строк, начинающихся с PART, может отличаться.

Теперь я хочу, чтобы этот файл был разбит на несколько файлов.

Каждый проанализированный файл должен иметь имя, содержащее информацию из определенного столбца строки, начинающейся с KABEL. В этом файле должна быть добавлена ​​каждая строка, начинающаяся с PART.

Затем, когда снова появится строка, начинающаяся с KABEL, будет создан новый файл и строки PART будут добавлены в этот файл... и так далее... и так далее.

Я много пробовал взад и вперед и наконец нашел способ правильно создать первые два файла... но... последний файл не будет создан.

Мой скрипт читает и находит и отображает правильный столбец того, что должно быть уникальной частью последнего проанализированного выходного файла, но я не вижу ни одного файла, выводимого.

Любой берущий? Я буду очень признателен за вашу помощь, так как я застрял...

{
    string line ="";
    string ColumnValue ="";
    string Starttext = "PART";
    string Kabeltext = "KABEL";
    int column = 16;     
    string FilenameWithoutCabelNumber = @"C:\Users\tsnm2171\Desktop\processed\LABB\OUTPUT - Provkanna for Windchill_NWF-TSNM_2212_CABLE_CONNECTION";
    string ExportfileIncCablenumber ="";
    string filecontent ="";

    using (System.IO.StreamReader reader = new System.IO.StreamReader(@"C:\Users\tsnm2171\Desktop\processed\LABB\Provkanna for Windchill_NWF-TSNM_2212_CABLE_CONNECTION.txt"))          
    {       
        line = reader.ReadLine();

        //Set columninnehåll till filnamn (String ColumnValue)   
        string [] words = line.Split();
        ColumnValue = words[column];

        MessageBox.Show (ColumnValue);

        while (line != null)                        
        {   
            line = reader.ReadLine();

            if (line.StartsWith(Kabeltext)) // if line starts with KABEL 
            {   
                ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + ColumnValue + ".txt");
                System.IO.File.WriteAllText(ExportfileIncCablenumber, filecontent);

                filecontent = string.Empty;
                string [] words2 = line.Split();
                ColumnValue = words2[column];

                MessageBox.Show("Ny fil " + ColumnValue);
            }
            else if (line.StartsWith(Starttext)) // if line starts with PART
            {
                filecontent += ((line)+"\n");           //writes the active line                                
            }                   
        }
        ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + ColumnValue + ".txt");
        System.IO.File.WriteAllText(ExportfileIncCablenumber, filecontent);                     filecontent = "";                                                                   
    }
}

заранее спасибо

Tomas

1 ответ

Прежде всего, вы должны делать чтение строк и режим проверки нуля, как это while((line = reader.ReadLine()) != ) потому что это защищает вас от нулевой ссылки. Моя версия, кажется, работает:

{
        const string StartText                  = "PART";
        const string KabelText                  = "KABEL";  
        const string FilenameWithoutCabelNumber = @"...\";

        string fileContent = "";
        int    fileNumber  = 0;

        using (StreamReader reader = File.OpenText(@"...\file.txt"))
        {       
            string line = reader.ReadLine();
            string columnValue = GetParticularColumnName(line);
            //Set columninnehåll till filnamn (String ColumnValue)   
            MessageBox.Show (ColumnValue);

            var ExportfileIncCablenumber ="";
            while ((line = reader.ReadLine()) != null)         
            {   
                if (line.StartsWith(KabelText)) // if line starts with KABEL 
                {   
                    ExportfileIncCablenumber =  $"{FilenameWithoutCabelNumber}-{columnValue}({fileNumber}).txt";

                    File.WriteAllText(ExportfileIncCablenumber, fileContent);

                    fileContent = string.Empty;
                    columnValue = GetParticularColumnName(line);
                    fileNumber++;
                }
                else if (line.StartsWith(StartText)) // if line starts with PART
                {
                    fileContent += ((line)+Environment.NewLine);    //writes the active line                                
                }                   
            }

            ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + columnValue + ".txt");
            File.WriteAllText(ExportfileIncCablenumber, fileContent);
        }
    }

    private static string GetParticularColumnName(string line)
    {
        return line.Split(' ').Last();
    }

Проблема с сохранением файлов возникла из-за неправильного понимания того, как String.Split() работает. Подробности смотрите в документации, но для краткости:

Если аргумент разделителя имеет значение NULL или не содержит символов, метод обрабатывает символы пробела как разделители.

Вот почему у вас был массив со словами и пустыми строками. column выбирал пустую строку, и поэтому у вас был один файл, перезаписывающий другой. (значение столбца 16 также неверно, на самом деле было 15 слов). Все ваши строки были объединены, потому что окна не воспринимают '\ n' как символ конца строки, поэтому я использую Environment.NewLine Последняя, ​​но не менее важная проблема - ваш стиль кода. В самом деле, вы должны придерживаться общих соглашений о кодировании для.Net, потому что это сделает ваш код последовательным и более читабельным.

Другие вопросы по тегам