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