Разбор текста в несколько отдельных файлов в зависимости от содержимого
У меня проблемы с получением последнего файла.
У меня есть текстовый файл с разделителями табуляции, который выглядит следующим образом.
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, потому что это сделает ваш код последовательным и более читабельным.