C# 如何有效地处理带分隔符的文本文件?
我只是试图对一个特定的文件执行C# 如何有效地处理带分隔符的文本文件?,c#,C#,我只是试图对一个特定的文件执行File.ReadAllLines,并对每一行执行|分割。我必须用正则表达式 下面的代码不起作用,但您将看到我正在尝试执行的操作: string[] contents = File.ReadAllLines(filename); string[] splitlines = Regex.Split(contents, '|'); foreach (string split in splitlines) { //Regex line = content.Spli
File.ReadAllLines
,并对每一行执行|
分割。我必须用正则表达式
下面的代码不起作用,但您将看到我正在尝试执行的操作:
string[] contents = File.ReadAllLines(filename);
string[] splitlines = Regex.Split(contents, '|');
foreach (string split in splitlines)
{
//Regex line = content.Split('|');
//content.Split('|');
string prefix = prefix = Regex.Match(line, @"(\S+)(\d+)").Groups[0].Value;
File.AppendAllText(workingdirform2 + "configuration.txt", prefix+"\r\n");
}
Split接受字符串,而不是字符串数组 我建议对每一项内容分别调用Regex.Split,然后循环调用的结果。这意味着嵌套for循环
string[] contents = File.ReadAllLines(filename);
foreach (string line in contents)
{
string[] splitlines = Regex.Split(line);
foreach (string splitline in splitlines)
{
string prefix = Regex.Match(splitline, @"(\S+)(\d+)").Groups[0].Value;
File.AppendAllText(workingdirform2 + "configuration.txt", prefix+"\r\n");
}
}
当然,这不是最有效的方法
更有效的方法可能是使用正则表达式进行拆分。我认为这是可行的:
string splitlines = Regex.Split(File.ReadAllText(filename), "$|\\|");
Regex.Split
,而不是数组line
而不是split
。如果我不了解你的代码,我无法判断它是否正确,但在任何情况下,它都是错误。(它也不应该构建)我并不完全清楚您试图做什么,但是您的代码中有许多错误。我试着猜你在做什么,但如果这不是你想要的,请最好用一些例子来解释你想要什么:
string inputFilename = "input.txt";
string outputFilename = "output.txt";
using (StreamWriter streamWriter = File.AppendText(outputFilename))
{
using (StreamReader streamReader = File.OpenText(inputFilename))
{
while (true)
{
string line = streamReader.ReadLine();
if (line == null)
{
break;
}
string[] splitlines = line.Split('|');
foreach (string split in splitlines)
{
Match match = Regex.Match(split, @"\S+\d+");
if (match.Success)
{
string prefix = match.Groups[0].Value;
streamWriter.WriteLine(prefix);
}
else
{
// Handle match failed...
}
}
}
}
}
要点:
- 您似乎希望在每一行上执行一个操作,因此需要在这些行上进行迭代
- 如果要拆分单个字符,请使用简单的string.Split方法。Split不接受字符,并且“|”在正则表达式中有特殊含义,因此除非您转义它,否则它无论如何都不会工作
- 您多次打开和关闭输出文件。你应该只打开它一次,直到你写完为止。使用关键字的
在这里很有用
- 使用WriteLine而不是附加“\r\n”
- 如果输入文件较大,请使用
而不是StreamReader
ReadAllLines
- 如果匹配失败,程序将抛出异常。在使用匹配之前,您可能应该检查
,如果返回false,请适当处理错误(跳过行、报告警告、抛出带有适当消息的异常等)match.Success
- 实际上,您没有在正则表达式中使用组1和组2,因此可以删除括号以保存正则表达式引擎,使其不必存储无论如何都不会使用的结果
string inputFile = filename;
string outputFile = Path.Combine( workingdirform2, "configuration.txt" );
using ( StreamReader inputFileStream = File.OpenText( inputFile ) )
{
using ( StreamWriter ouputFileStream = File.AppendText( outputFile ) )
{
// Iterate over the file contents to extract the prefix
string currentLine;
while ( ( currentLine = inputFileStream.ReadLine() ) != null )
{
// Notice the updated Regex - your's is a bit broken
string prefix = Regex.Match( currentLine, @"^(\S+?)\d+" ).Groups[1].Value;
ouputFileStream.WriteLine( prefix );
}
}
}
这将需要一个包含以下内容的文件:
Text1231|abc|abc
Text1232|abc|abc
Text1233|abc|abc
Text1234|abc|abc
地点:
Text
Text
Text
Text
进入一个新文件
我希望这至少能让你走上正确的道路。我的水晶球越来越模糊了。。haaazzy.在C#中处理文本文件的最佳方法之一可能是使用。看一看。它允许您强式键入导入数据。当您说“不工作”时,您的意思是什么?另外,为什么它会读“字符串前缀=前缀=…”?因为您从不创建行字符串,所以它没有意义。即使在您的评论中,行也是一个正则表达式,您不能将其传递给Regex.Split。你想完成什么?你能描述一下你想做什么吗?顺便说一句:如果你打算放弃ReadAllLines,那真的是浪费内存。我很想这样做,但我必须每两次做一个foreach,这可能包括构建一个大约400万次的字符串。是的,不能这样做,这将是一个漫长的过程每个输出行大约4个整数,第二个foreach可能增加2k行。请参阅添加的第二个选项。使用此方法(或类似方法),可以同时按行和“|”字符拆分整个文件。然后像以前一样做你的动作。@Ryan:说得好。他确实明确要求一种有效的方法。