【问题标题】:C# text creation issueC# 文本创建问题
【发布时间】:2010-03-25 00:39:55
【问题描述】:

这是怎么回事。我有一个巨大的文本文件,假设每个条目只有 1 行。问题是有时换行换行。

我编辑了整个文件,如果文件不以 ("\"A) 开头,我需要将当前行附加到上一行(将 \n 替换为 " ")。我想出的所有东西都会不断地将行附加到新行。任何帮助都可以得到...

代码:

    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);
            }

        }

    }

示例: 来源:
"\"A"英雄|苹果|橙子|为了好玩
"\"A"英雄|苹果|芒果|总是有很多乐趣
"\"A"她|苹果|水果|没有
痛苦是一种方式
"\"A"英雄|love|stackoverflowpeople|更多乐趣

结果:
"\"A"英雄|苹果|橙子|为了好玩
"\"A"英雄|苹果|芒果|总是有很多乐趣
"\"A"她的|苹果|水果|不疼就是办法
"\"A"英雄|love|stackoverflowpeople|更多乐趣

我的问题不是找到 if (line.StartsWith(begins)) 它的 else 语句,而是将 line2 附加到新行

【问题讨论】:

  • 我不明白您遇到的问题...请详细说明。

标签: c#


【解决方案1】:

看来您的字符串格式不正确...

试试这个"\"\\\"A\""

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);
            }

        }

    }

【讨论】:

  • 我不明白这是如何工作的。就像 OP 所做的那样,您似乎将换行符放在错误的位置。
  • @Jeffrey L Whitledge:实际上你是对的......我确实看到了字符串的问题,但没有看到附加的东西......我的错
  • 嗯我的问题不是找到 if (line.StartsWith(begins)) 它的 else 语句,它将 line2 附加到新行
【解决方案2】:

这就是你想要的:

    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);
        }
    }

} 

不过,它确实存在附加到现有文件的问题。我建议using 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);
            }
        }
    }
} 

【讨论】:

  • 那行不通。如果一行格式正确(而不是第一行),您总是写一个换行符。仅当以下行的格式也正确时,您才应该这样做。
  • @klausbyskov - 嗯,不。只要后面不写换行符,就可以写一行。
  • 我在发布之前实际测试了这段代码,这就是为什么我是唯一一个答案输出空格字符的人,而原来的额外换行符是这样的。测试数据需要它,OP在示例代码中包含了该部分,但这不是问题的重点。
【解决方案3】:

您的问题是 \ 是 C# 转义码。
您的字符串被解析为"A,因为\" 是单个" 的转义码。

您应该将begins 字符串设为不使用转义码的@-string。
然后你需要通过加倍来逃避"。 例如:

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 你不能总是在 if 部分使用WriteLine。如果该行不是StartWith 常量,则需要将其与以下行一起加入。
  • 这将在输出文件的开头添加一个额外的空白行。
【解决方案4】:

基于@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);
    } 
} 

【讨论】:

  • 此代码会将具有正确前缀的行添加到具有不正确前缀的行的末尾,而不是删除杂散的换行符。
  • @Jeffrey L Whitledge:嗯,不,我认为不会。
  • 如果格式正确,它确实忘记打印最后一行的值。我已经修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多