我有一行像
string row = "1;\"2\";\"3;4\";\"5\"6\";\"7;\"8\";9\"";
现在我想将行拆分为此结果
[1],[2],[3;4],[5"6],[7;"8],[9"]
分隔符:;
量词:"
不幸的是,[5"6],[7;"8]
合并了togeter
代码
public static IEnumerable<string> SplitCSV(string input, char separator, char quotechar)
{
StringBuilder sb = new StringBuilder();
bool escaped = false;
for (int i = 0; i < input.Length; i++)
{
if (input[i] == separator && !escaped)
{
yield return sb.ToString();
sb.Clear();
}
else if (input[i] == separator && escaped)
{
sb.Append(input[i]);
}
else if (input[i] == quotechar)
{
escaped = !escaped;
sb.Append(input[i]);
}
else
{
sb.Append(input[i]);
}
}
yield return sb.ToString();
}
根据csv惯例,我的代码中是否有错误或输入无效?
更新:请避免涉及第三方图书馆的消息
答案 0 :(得分:2)
我认为问题出在这里,你在引用中也使用了引号char。在你的if / else你没有照顾这个!而是使用每个引号char切换escaped
。
这个怎么样:
else if (input[i] == quotechar)
{
if (i+1<input.Length && input[i+1]==separator)
escaped = !escaped;
else
sb.Append(input[i]);
}
顺便说一句:如果原始的CSV字符串是正确的,我不能说-.-
答案 1 :(得分:2)
你与引用者不匹配。
请参阅下面的实际组
df = df.reindex(df.index - pd.to_timedelta(30, unit='d'), method='nearest')