替换长json字符串中的新行符号[关闭]

Posted

技术标签:

【中文标题】替换长json字符串中的新行符号[关闭]【英文标题】:Replace new lines symbols in long json string [closed] 【发布时间】: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);

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

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

【问题讨论】:

看看这是否有帮助***.com/questions/16331770/… 替换不会改变您的输入,它会返回一个新值。您永远无法更改现有字符串,只需创建一个新字符串 @HansKesting,哦,是的......刚刚注意到这一点。谢谢。将尝试此修复 【参考方案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 秒

【讨论】:

以上是关于替换长json字符串中的新行符号[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

json_decode() (PHP 7) 中的新行和标签

使用mysql命令删除字符串中的转义符号[关闭]

字符串在json中递归替换值

从asp到json和jquery的新行

使用 shellscript 用 config.json 中定义的 1-n 个特定值替换 html 文件中的占位符 [关闭]

Swift - JSON字符串打印\ n而不是新行