C# 控制台应用程序c中的平面文件格式#
全部, 我有一个平面文件,我想删除结尾或中间的空行和额外的标题。以下是格式 预期格式:C# 控制台应用程序c中的平面文件格式#,c#,.net,visual-studio,C#,.net,Visual Studio,全部, 我有一个平面文件,我想删除结尾或中间的空行和额外的标题。以下是格式 预期格式: addsad, sadasd |sdsf-sdff-sfg |sffdff, sdfadgg , fg |04/15/20 12:30|sd sf 36 24567 |dsfg gfdgg fghjN
addsad, sadasd |sdsf-sdff-sfg |sffdff, sdfadgg , fg |04/15/20 12:30|sd sf 36
24567 |dsfg gfdgg fghjN |1 |fhhh
24568 |dsfg gfdgg fghjN |1 |fhhh
24569 |dsfg gfdgg fghjN |1 |fhhh
24579 |dsfg gfdgg fghjN |1 |fhhh
24571 |dsfg gfdgg fghjN |1 |fhhh
24572 |dsfg gfdgg fghjN |1 |fhhh
24573 |dsfg gfdgg fghjN |1 |fhhh
24574 |dsfg gfdgg fghjN |1 |fhhh
24575 |dsfg gfdgg fghjN |1 |fhhh
24576 |dsfg gfdgg fghjN |1 |fhhh
24577 |dsfg gfdgg fghjN |1 |fhhh
24578 |dsfg gfdgg fghjN |1 |fhhh
24579 |dsfg gfdgg fghjN |1 |fhhh
24581 |dsfg gfdgg fghjN |1 |fhhh
24582 |dsfg gfdgg fghjN |1 |fhhh
24583 |dsfg gfdgg fghjN |1 |fhhh
格式错误-1:(末尾有空行,突出显示为*)
格式错误-2:
addsad, sadasd |sdsf-sdff-sfg |sffdff, sdfadgg , fg |04/15/20 12:30|sd sf 36
24567 |dsfg gfdgg fghjN |1 |fhhh
24568 |dsfg gfdgg fghjN |1 |fhhh
24569 |dsfg gfdgg fghjN |1 |fhhh
24579 |dsfg gfdgg fghjN |1 |fhhh
24571 |dsfg gfdgg fghjN |1 |fhhh
24572 |dsfg gfdgg fghjN |1 |fhhh
24573 |dsfg gfdgg fghjN |1 |fhhh
24574 |dsfg gfdgg fghjN |1 |fhhh
编写的代码:(这只是删除所有空行)
要求:需要格式化错误的格式文件,以便获得预期的格式,需要删除空行(第一行除外)并删除重复的标题。附加图片以供参考尝试逐行写入,如果遇到空行,则忽略该行和下一行(标题)
static void Main(string[] args)
{
var ignoreNext = false;
using var stream = new StreamWriter("targetFile.txt", true);
foreach (var line in File.ReadLines("sourceFile.txt"))
{
if (line == null || line.Trim() == string.Empty)
{
ignoreNext = true;
}
else if (!ignoreNext)
{
stream.WriteLine(line);
}
else
{
ignoreNext = false;
}
}
}
以下是源文件:
和目标文件:
尝试逐行书写,如果您遇到空行,则忽略该行和下一行(标题)
static void Main(string[] args)
{
var ignoreNext = false;
using var stream = new StreamWriter("targetFile.txt", true);
foreach (var line in File.ReadLines("sourceFile.txt"))
{
if (line == null || line.Trim() == string.Empty)
{
ignoreNext = true;
}
else if (!ignoreNext)
{
stream.WriteLine(line);
}
else
{
ignoreNext = false;
}
}
}
以下是源文件:
和目标文件:
尝试以下操作:
private void FixFile (string filename)
{
//read existing file
string[] lines = File.ReadAllLines(filename);
//overwrite existing file
using (StreamWriter sw = new StreamWriter(filename, false))
{
for (int i = 0; i < lines.Length; i++)
{
//trim leading/trailing spaces
string currentLine = lines[i].Trim();
//skip additional headers - header lines contain a date which has '/'
if (i >= 2 && !String.IsNullOrEmpty(currentLine) && !currentLine.Contains('/'))
{
sw.WriteLine(currentLine);
}
else if (i < 2)
{
//keep first two lines
sw.WriteLine(currentLine);
}
}
//clean up
sw.Flush();
sw.Close();
sw.Dispose();
}
}
private void FixFile(字符串文件名)
{
//读取现有文件
string[]lines=File.ReadAllLines(文件名);
//覆盖现有文件
使用(StreamWriter sw=新StreamWriter(文件名,false))
{
对于(int i=0;i=2&&!String.IsNullOrEmpty(currentLine)&&&!currentLine.Contains('/'))
{
软件写入线(电流线);
}
否则如果(i<2)
{
//保持前两行
软件写入线(电流线);
}
}
//清理
sw.Flush();
sw.Close();
sw.Dispose();
}
}
尝试以下操作:
private void FixFile (string filename)
{
//read existing file
string[] lines = File.ReadAllLines(filename);
//overwrite existing file
using (StreamWriter sw = new StreamWriter(filename, false))
{
for (int i = 0; i < lines.Length; i++)
{
//trim leading/trailing spaces
string currentLine = lines[i].Trim();
//skip additional headers - header lines contain a date which has '/'
if (i >= 2 && !String.IsNullOrEmpty(currentLine) && !currentLine.Contains('/'))
{
sw.WriteLine(currentLine);
}
else if (i < 2)
{
//keep first two lines
sw.WriteLine(currentLine);
}
}
//clean up
sw.Flush();
sw.Close();
sw.Dispose();
}
}
private void FixFile(字符串文件名)
{
//读取现有文件
string[]lines=File.ReadAllLines(文件名);
//覆盖现有文件
使用(StreamWriter sw=新StreamWriter(文件名,false))
{
对于(int i=0;i=2&&!String.IsNullOrEmpty(currentLine)&&&!currentLine.Contains('/'))
{
软件写入线(电流线);
}
否则如果(i<2)
{
//保持前两行
软件写入线(电流线);
}
}
//清理
sw.Flush();
sw.Close();
sw.Dispose();
}
}
对于您的情况,当您知道数据是什么样子时,我会稍微改变一下方法,然后
var all = File.ReadAllLines(sourceDirectory).ToList();
var dataLines = all.Where(l => Regex.IsMatch(l, @"^\d+"));
var lines = all.Take(2).Concat(dataLines).ToList();
File.WriteAllLines(targetDirectory, lines);
不确定您是否需要第一个空行,如果您不需要,则将其设为
all。跳过(1)。对于您的情况,请选择(1)
,当您知道数据的外观时,我会稍微改变处理方式,然后执行以下操作
var all = File.ReadAllLines(sourceDirectory).ToList();
var dataLines = all.Where(l => Regex.IsMatch(l, @"^\d+"));
var lines = all.Take(2).Concat(dataLines).ToList();
File.WriteAllLines(targetDirectory, lines);
不确定是否需要第一个空行,如果不需要,则将其设为
all。跳过(1)。取(1)
是的,这很容易(在合理范围内)。然而,这是一种在其他地方解决问题的技巧。如果你真的需要这么做的话,我建议你修改一下(如果可以的话),你必须给我们一个关于什么表示头的规则。我们可以写一些神奇的方法来读懂你的心思,或者说伪数据头永远是第二行,第一行永远是空的,第二行永远是头。这一切都很好,但是你说“删除重复的头”,我们怎么知道与实际数据相比,头是什么?哪些信息是标题中的、特殊的和唯一的,我们知道可以安全地删除重复的标题<代码>添加SAD不够好。。。注意:我仍然建议修复创建此文件的程序。第二行“Addsad”中的任何内容都是该文件的唯一头,如果在同一文件的不同行中重复此操作,则我们必须将其删除。在我提供的错误格式中,“Addsad”在第14行中重复,如图所示,应与空行一起删除,希望这能解释清楚?是的,这很容易(在合理范围内)。然而,这是一种在其他地方解决问题的技巧。如果你真的需要这么做的话,我建议你修改一下(如果可以的话),你必须给我们一个关于什么表示头的规则。我们可以写一些神奇的方法来读懂你的心思,或者说伪数据头永远是第二行,第一行永远是空的,第二行永远是头。这一切都很好,但是你说“删除重复的头”,我们怎么知道与实际数据相比,头是什么?哪些信息是标题中的、特殊的和唯一的,我们知道可以安全地删除重复的标题<代码>添加SAD不够好。。。注意:我仍然建议修复创建此文件的程序。第二行“Addsad”中的任何内容都是该文件的唯一头,如果在同一文件的不同行中重复此操作,则我们必须将其删除。在我提供的错误格式中,“Addsad”在第14行中重复出现,如图所示,应该与空行一起删除希望这可以解释?它不起作用,我得到的是“没有与字符串的必需形式参数'valuye'相对应的参数。IsNullOrWhiteSpace(string)@sukra我更新了答案,尝试了一下,效果很好。@TheGeneral它确实有效,我只是按照你的建议将它改成了ReadLines
。啊,是的,我错了,这是我想要的答案。我可能已经将line==null | | line.Trim()==string.Empty
替换成了string.IsNullOrWhitespace(line)
为了使其更具可读性。它不起作用,我得到“没有与字符串的必需形式参数‘valuye’相对应的参数。IsNullOrWhiteSpace(string)@su