1

好的,我的 csv 构建器基本上可以工作。它有 3 列。姓名、职位、日期。不幸的是,现在导出有 4 列。姓氏,名字,职位,日期。这是因为我从数据库中获取的名称数据是 Last, First。无论如何我可以轻松更改此分隔符吗?这会很方便哈哈。

4

3 回答 3

1

我不得不这样做好几次,你最好的办法是把你的名字包起来。这确实意味着您必须单独处理它(有点)。

根据我在您的问题中阅读的内容,您正在从具有三列的数据库中提取值:Name(LName, FName) Position、 和Date. 所以你的 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 之间的逗号。

于 2010-08-23T16:31:29.670 回答
0

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

"Last, First",Admin,2010/01/01
于 2010-08-23T16:15:32.523 回答
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”格式。

于 2010-08-23T16:28:26.137 回答