使用分隔符和文本量词拆分CSV

时间:2018-05-08 07:14:38

标签: c# string

我有一行像

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惯例,我的代码中是否有错误或输入无效?

更新:请避免涉及第三方图书馆的消息

2 个答案:

答案 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')