Member 12841827 Ответов: 2

Разбор txt файла условно и запись выходных данных в файл


Я пытаюсь разобрать txt-файл в нужный o/p, чтобы открыть его как CSV после завершения разбора. Имея немного знаний о Linq, я попытался закодировать процесс синтаксического анализа, но мне не хватает чего-то, что я сам не могу понять. Любая помощь будет оценена по достоинству.!

Входной файл:
          Left Rulegd  ATTR001.PDST.MPDTMP01(A001PMTR)  PROTY(01),BRPKY(A0Y)
A001PMTR           0    00AF   123456A11  2011/12/14  ENT tmp
          Left Rulegd  ATTR001.PDST.MPDTMP01(B001PRTY)  PROTY(01),BRPKY(A0Y)
B001PRTY   1       0    12AB   7891P12    2010/08/25  AMP tmp
B234561    2       0       0   7891P12    2011/09/12  URTST tmp
          Left Rulegd  ATTR001.PDST.MPDTMP01(C001AMEF)  PROTY(01),BRPKY(A0Y)
C001AMEF           0    PZ89   123456A11  2013/11/02  AMP tmp
          Left Rulegd  ATTR001.PDST.MPDTMP01(D001AAM)  PROTY(01),BRPKY(A0Y)
D001AAM            0    OP25   123456A11  2009/02/14  ENT tmp


Желаемый результат:
ATTR001.PDST.MPDTMP01(A001PMTR),PROTY(01),BRPKY(A0Y),123456A11,2011/12/14,ENT tmp 
ATTR001.PDST.MPDTMP01(B001PRTY),PROTY(01),BRPKY(A0Y),7891P12,2010/08/25,AMP tmp 
ATTR001.PDST.MPDTMP01(C001AMEF),PROTY(01),BRPKY(A0Y),123456A11,2013/11/02,AMP tmp 
ATTR001.PDST.MPDTMP01(D001AAM),PROTY(01),BRPKY(A0Y),123456A11,2009/02/14,ENT tmp


Что я уже пробовал:

void Main()
{
	int counter = 0;
	string line;
	string line1;
	string srchBegin = "Left Rulegd";
	char delim = ' ';
	IEnumerable<string> allRecords;

	string filePath = @"C:\Users\vgruber\Desktop\input.TXT";
	if (File.Exists(filePath))
	{
		allRecords = File.ReadLines(filePath);
	}
	else
	{
		Console.WriteLine("File do not exist!");
	}

	StreamReader reader = File.OpenText(filePath);
	try
	{
	
	while ((line = reader.ReadLine()) != null)
	{
		
		if (line.Contains(srchBegin))
		{
			
			var values = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
			var result = String.Join(",", values).Remove(0, 12);			
			Console.WriteLine(result);	
		}
		else
		{
			var values1 = line.Substring(30);
			var result1 = string.Join(",", values1);
			Console.WriteLine(result1);			
		}
	}
	reader.Close();
	}
	catch(Exception er) 
	{
		
	}
}

// Define other methods and classes here

[no name]

"Я что-то упускаю", да, вы упускаете описание реальной проблемы, которая у вас есть.

2 Ответов

Рейтинг:
2

Patrice T

Много возможностей в зависимости от ситуации:
- если текст для удаления всегда один и тот же в начале строки. Просто пропустите первые 23 символа.
Что-то вроде этого может даже сделать трюк.

var result = line.SubString(23);


- если удаляемая часть больше похожа на шаблон, то регулярное выражение (регулярные выражения), скорее всего, поможет.

[Обновление]
После форматирования входных данных кажется, что все немного сложнее, и регулярные выражения определенно находятся в порядке.
Я бы построил регулярное выражение для идентификации интересных частей с группами и использовал replace для перекомпозиции результата.
Пример с началом решения:
string pattern =  @"^ *Left Rulegd *([^ ]+) *([^ ]+)\n([^ ]+)";
string input = "          Left Rulegd  ATTR001.PDST.MPDTMP01(A001PMTR)  PROTY(01),BRPKY(A0Y)\nA001PMTR           0    00AF   123456A11  2011/12/14  ENT tmp";
string replacement = "$1,$2,$3";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);


Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]


Рейтинг:
2

Midi_Mick

else
{
var values1 = line.Substring(30).Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var result1 = string.Join(",", values1);
Console.WriteLine(result1);	
}


вы забыли разделить строку values1 перед соединением