【问题标题】:Replace new lines symbols in long json string [closed]替换长json字符串中的新行符号[关闭]
【发布时间】:2020-01-03 23:36:34
【问题描述】:

我有一个包含 JSON 字符串的文件。长串。大约 70 万个符号。

我正在尝试反序列化它。

但它包含 \r\n 等符号,应替换为逗号 ,

我尝试使用Regex 进行操作,但它卡在上面没有错误。

private static readonly Regex Pattern = new Regex("(\r\n|\r|\n)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

Pattern.Replace(dataString, ",");

还尝试将string 转换为StringBuilder 并使用简单的.Replace

private readonly IDictionary<string, string> replacements = new Dictionary<string, string> { { "\r\n", "," }, { "\r", "," }, { "\n", "," } };

foreach (var replacement in this.replacements)
{
     dataStringBuilder.Replace(replacement.Key, replacement.Value);
}

第二种情况更好,但直到文件变大为止。 所以现在我在这两种情况下都被卡住了。

还有其他推荐的更快的解决方案吗?

【问题讨论】:

  • 替换不会改变您的输入,它会返回一个新值。您永远无法更改现有字符串,只需创建一个新字符串
  • @HansKesting,哦,是的......刚刚注意到这一点。谢谢。将尝试此修复

标签: c# .net regex string replace


【解决方案1】:

您可以使用手动复制字符串的简单方法,自己转换换行符。这使您能够只迭代底层字符数组一次,并避免代价高昂的 string/StringBuilder 对象重新分配:

char[] converted = new char[input.Length];
int pos = 0;
bool lastWasCr = false;
foreach(char c in input)
{
    if(c == '\r')
    {
        converted[pos++] = ',';
        lastWasCr = true;
    }
    else
    {
        if(c == '\n')
        {
            if(!lastWasCr)
                converted[pos++] = ',';
        }
        else
            converted[pos++] = c;
        lastWasCr = false;
    }
}
string output = new string(converted, 0, pos);

此循环遍历每个字符,并检测和替换换行符。请注意,我们必须跟踪最近的回车 (\r),以避免在 Windows 换行符 (\r\n) 上出现重复的 ,


我将您的两种方法与上面的代码进行了比较,使用随机的 650kb 文本文件,并对每个实现执行 1000 次迭代。

结果:

  • Regex.Replace: 62.3233sec(这甚至不包括像编译正则表达式这样的初始化)
  • StringBuilder.Replace: 7.0622sec(固定版本,如对您问题的评论中所示)
  • if 语句的字符循环:2.3862 秒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多