更改csv导出中的分隔符

时间:2010-08-23 16:12:18

标签: c# csv delimiter

好的,我的csv构建器基本上正常工作。它有3列。姓名,职位,日期。不幸的是,目前出口有4列。姓氏,名字,职位,日期。这是因为我从我的数据库中获取的名称是Last,First。反正我还能轻易改变这个分隔符吗?哈哈这样会很方便。

3 个答案:

答案 0 :(得分:1)

我必须多次这样做,最好的办法就是把你的名字包起来。这意味着你必须单独处理它(某种程度)。

根据我在您的问题中所阅读的内容,您从具有三列的数据库中提取值:Name(LName,FName),PositionDate 。所以你的SQL语句看起来像:SELECT Name, Position, [Date] FROM Table WHERE ...你可能在某个地方有一个数据阅读器。

根据这些假设,我会这样做:

//SQL Connection and SQL Command have been created separately as _conn and _cmd
using(SqlDataReader _read = _cmd.ExecuteReader())
{
    string name = "";
    string position = "";
    string date = "";

    while(_read.Read()) //don't really do this, make sure you're checking for nulls and such
    {
       name = _read.GetString(0);
       position = _read.GetString(1);
       date = _read.GetString(2);

       AddLineToLines(string.Format("{0}|{1}|{2}", name, position, date));
          //AddLineToLines is a call to add to your list of lines so you can 
          // write your file.
    }
}

这将允许您创建一个管道分隔文件(而不是CSV),并避免必须转义逗号。

如果您必须拥有csv,请将最后string.Format更改为

string.Format("\"{0}\",{1},{2}", name, position, date)

将转义LastName和FirstName之间的逗号。

答案 1 :(得分:0)

大多数CSV解析器都会识别引号以补偿数据中的逗号。

"Last, First",Admin,2010/01/01

答案 2 :(得分:0)

问题不在于更改分隔符(您只需使用逗号将代码中的位更改为您想要使用的任何字符),但之后它将无法实现互操作。

你的问题是你没有正确地逃离你的田地。做类似的事情:

private void WriteItem<T>(StreamWriter sr, T item)
{
    string itemString = item.ToString();
    if(itemString.IndexOfAny('"', ',', '\n', '\r') != -1)//skip test and always escape for different speed/filesize optimisation
    {
        sr.Write('"');
        sr.Write(itemString.Replace("\"", "\"\""));
        sr.Write('"');
    }
    else
        sr.Write(itemString);
}
private void WriteLine<T>(StreamWriter sr, IEnumerable<T> line)
{
    bool first = true;
    foreach(T item in line)
    {
        if(!first)
            sr.Write(',');
        first = false;
        WriteItem(sr, item);
    }
}
private void WriteCSV<T>(StreamWriter sr, IEnumerable<IEnumerable<T>> allLines)
{
    bool first = true;
    foreach(IEnumerable<T> line in allLines)
    {
        if(!first)
            sr.Write('\n');
        first = false;
        WriteLine(sr, line);
    }
}

并且当存在“或”换行符时,WriteItem中引用该项目的位将处理您的“Last,First”格式。