C#文本创建问题
事情就是这样。我有一个巨大的文本文件,假设每个条目有一行。问题是有时这条线会被一条新的线打断 我编辑整个文件,如果文件不是以(“\”A)开头,我需要将当前行附加到前一行(用“\”替换\n)。我想到的每一件事都不断地把这一行附加到新的一行上。感谢您的帮助 代码:C#文本创建问题,c#,C#,事情就是这样。我有一个巨大的文本文件,假设每个条目有一行。问题是有时这条线会被一条新的线打断 我编辑整个文件,如果文件不是以(“\”A)开头,我需要将当前行附加到前一行(用“\”替换\n)。我想到的每一件事都不断地把这一行附加到新的一行上。感谢您的帮助 代码: public void step1a() { string begins = ("\"A"); string betaFilePath = @"C:\ext.txt";
public void step1a()
{
string begins = ("\"A");
string betaFilePath = @"C:\ext.txt";
string[] lines = File.ReadAllLines(betaFilePath);
foreach (string line in lines)
{
if (line.StartsWith(begins))
{
File.AppendAllText(@"C:\xt2.txt",line);
File.AppendAllText(@"C:\xt2.txt", "\n");
}
else
{
string line2 = line.Replace(Environment.NewLine, " ");
File.AppendAllText(@"C:\xt2.txt",line2);
}
}
}
例如:
来源:“一个”英雄|苹果|橘子| |为了好玩
“一个”英雄|苹果|芒果|总是充满乐趣
“一个”她的苹果水果不
痛苦就是出路
“一个”英雄|爱|堆积如山|人|更有趣 结果:
“一个”英雄|苹果|橘子| |为了好玩
“一个”英雄|苹果|芒果|总是充满乐趣
“一个”她的“苹果”水果“没有痛苦的方法
“一个”英雄|爱|堆积如山|人|更有趣
我的问题不是查找if(line.StartsWith(begins))它是else语句,它将第2行附加到新行似乎字符串的格式不正确 试试这个
“\\\\\\\\\\\\\\”
public void step1a()
{
string begins = ("\"\\\"A\"");
string betaFilePath = @"C:\ext.txt";
string[] lines = File.ReadAllLines(betaFilePath);
foreach (string line in lines)
{
if (line.StartsWith(begins))
{
File.AppendAllText(@"C:\xt2.txt",line);
File.AppendAllText(@"C:\xt2.txt", "\n");
}
else
{
string line2 = line.Replace(Environment.NewLine, " ");
File.AppendAllText(@"C:\xt2.txt",line2);
}
}
}
您的问题是
\
是一个C#转义码。您的字符串被解析为
“A
,因为\”
是单个“
的转义码
您应该将开头
字符串设置为@字符串,该字符串不使用转义码。然后,您需要将
“
翻一倍以避开它。
例如:
const string begins = @"\""A";
请注意,最好的方法是使用StreamWriter
,如下所示:
using(StreamWriter writer = File.Create(@"C:\xt2.txt"))
{
foreach (string line in lines)
{
if (line.StartsWith(begins))
writer.WriteLine(); //Close the previous line
writer.Write(line);
}
}
根据@SLaks的示例,这里有一些代码可以实现这一点:
public static void step1a()
{
string betaFilePath = @"C:\ext.txt";
string[] lines = File.ReadAllLines(betaFilePath);
using (StreamWriter writer = new StreamWriter(File.Create(@"C:\xt2.txt")))
{
string buffer = null;
foreach (string line in lines)
{
if (!line.StartsWith(begins))
{
writer.WriteLine(buffer + line);
buffer = null;
}
else
{
if (buffer != null)
writer.WriteLine(buffer);
buffer = line;
}
}
if(buffer != null)
Console.Out.WriteLine(buffer);
}
}
这正是您想要的:
CopyFileRemovingStrayNewlines(@"C:\ext.txt", @"C:\xt2.txt", @"""\""A");
使用此方法:
public static void CopyFileRemovingStrayNewlines(string sourcePath, string destinationPath, string linePrefix)
{
string[] lines = File.ReadAllLines(sourcePath);
bool firstLine = true;
foreach (string line in lines)
{
if (line.StartsWith(linePrefix))
{
if (!firstLine)
File.AppendAllText(destinationPath, Environment.NewLine);
else
firstLine = false;
File.AppendAllText(destinationPath, line);
}
else
{
File.AppendAllText(destinationPath, " ");
File.AppendAllText(destinationPath, line);
}
}
}
但是,它确实存在附加到现有文件的问题。我建议使用StreamWriter
而不是AppendAllText
。如下所示:
public static void CopyFileRemovingStrayNewlines(string sourcePath, string destinationPath, string linePrefix)
{
string[] lines = File.ReadAllLines(sourcePath);
bool firstLine = true;
using (StreamWriter writer = new StreamWriter(destinationPath, false))
{
foreach (string line in lines)
{
if (line.StartsWith(linePrefix))
{
if (!firstLine)
writer.WriteLine();
else
firstLine = false;
writer.Write(line);
}
else
{
writer.Write(" ");
writer.Write(line);
}
}
}
}
我不理解您遇到的问题…请详细说明。@SLaks您不能总是在if部分中使用WriteLine
。如果该行没有StartWith
常量,则需要将其与下一行连接。这将在输出文件的开头添加一个额外的空行。我看不出这是如何工作的。看起来像你把新行字符放错了位置,就像OP一样。@Jeffrey L Whitledge:事实上你是对的……我确实看到了da字符串的问题,但没有看到da附加的东西……我的问题不是找到if(line.StartsWith(begins))这是else语句,它将第2行附加到一个新行。这段代码将在一个前缀不正确的行的末尾出现一个前缀正确的行,而不是删除多余的新行字符。@Jeffrey L Whitledge:嗯,不,我认为不会。但是,如果格式正确,它确实忘记打印最后一行的值。我有e修改我的答案。那不行。如果一行格式正确(而不是第一行),你总是写一个换行符。只有在以下行的格式正确的情况下,您才应该这样做。@klausbyskov-嗯,不。只要后面没有写换行符,就可以写这行。实际上,我在发布代码之前测试了这段代码,这就是为什么我是唯一一个在额外换行符之前输出空格字符的人。测试数据需要它,and OP在示例代码中包含了该部分,但它不是问题的焦点。