好的,我的csv构建器基本上正常工作。它有3列。姓名,职位,日期。不幸的是,目前出口有4列。姓氏,名字,职位,日期。这是因为我从我的数据库中获取的名称是Last,First。反正我还能轻易改变这个分隔符吗?哈哈这样会很方便。
答案 0 :(得分: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之间的逗号。
答案 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”格式。