替换长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字符串中的新行符号[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 shellscript 用 config.json 中定义的 1-n 个特定值替换 html 文件中的占位符 [关闭]