【问题标题】:C# Stringbuilder replace with a null valueC# Stringbuilder 用空值替换
【发布时间】:2015-03-05 12:50:00
【问题描述】:

我正在尝试使用 Stringbuilder 为我构建一个 csv 文件,并且我正在使用的文件中的一些字段包含双引号。 我有这段代码,如您所见,我正在尝试使用 .replace 删除 " 并替换为 nothing,这会引发空字符文字错误。有没有更简单的方法来删除所有双引号`

public void Manipulatefile(string csv, string suffix)
    {
        StringBuilder formattedData = new StringBuilder();

        // Read all file lines into a string array.
        string path = @csv;
        string[] fileLines = File.ReadAllLines(path);

        foreach (string fileLine in fileLines)
        {

            string[] lineItems = fileLine.Split(new char[1] { ',' });


            string forename = lineItems[0];


            string surname = lineItems[1];


            formattedData.Append(forename);

            // Add the CSV seperator.
            formattedData.Append(",");

            // Append the forename to the current CSV output line.
            formattedData.Append(surname);


            formattedData.Append(",");

            formattedData.Append(forename.Substring(1,1));
            formattedData.Append(surname);
            formattedData.Append(suffix);

            formattedData.Replace('"', '');
            formattedData.AppendLine();

            File.WriteAllText(@"C:\test\MyFile.csv", formattedData.ToString());
        }

谢谢

【问题讨论】:

  • 将 formattedData.Replace('"', ''); 改为 formattedData.Replace("\"", "");

标签: c# stringbuilder character-replacement


【解决方案1】:

字符文字必须是一个字符。 string 是零个或多个字符的序列。你想要一个没有字符的字符串,因为你不能有一个代表没有字符的字符。

Replace 的另一个重载接受字符串而不是字符作为其参数。

附带说明,CSV 文件可以用另一个引号转义字段值内的引号,因此如果您的字段值为:This is my "Value",您可以将其写为This is my ""Value"",它将被正确解释。如果您可以在您的情况下完全删除引号,那很好,只需知道有一个已定义的案例来说明如何在不违反语法的情况下实际保留引号。

【讨论】:

    【解决方案2】:

    .Replace 可以接受字符串,空字符串有效,所以只需将双引号转义即可

    formattedData.Replace("\"", "");
    

    值得注意的是,您的代码行以逗号分隔

    string[] lineItems = fileLine.Split(new char[1] { ',' });
    

    会产生不希望的效果,即拆分带有逗号的任何字符串。双引号的全部意义在于隔离逗号,以便列可以包含逗号。例如

    name,address,phone
    "Joe","22 acacia avenue, mean street, LA","555-1234"
    

    您的代码会将这一行分成五个值,而不是预期的三个值。您应该真正使用专用的 CSV 解析器。

    【讨论】:

    • 谢谢,它打开的文件将来自 SIMS 报告,所以我知道输入是什么。它是 formattedData.Append(","); formattedData.Append(forename.Substring(1,1));子字符串从某个地方引用了一个引号,但如果我只使用名字它就没有。
    • 在这种情况下,您应该足够安全地使用它。祝你好运!
    【解决方案3】:

    没有空字符这样的东西。您可以获得的最接近的是'\0',即Unicode“空”字符。 但是你为什么不使用string?您需要使用\ 转义"

    formattedData.Replace("\"", "");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多