在C#中编写以制表符分隔的CSV文件

6
我目前正在开发一个C#应用程序,需要从MySQL数据库检索数据并编写一个使用制表符分隔的CSV文件。数据库检索工作正常。
我遇到的问题是如何编写文件。在我写入每个变量之间时,我使用 \t,我认为这会在csv中插入一个制表符,因此在Excel中打开时,每个变量都将位于自己的单元格中。
然而,由于某种原因,它并没有这样做,而是将整行写为一个长字符串。下面是我编写的代码示例:
while (reader.Read())
{
    int bankID = reader.GetInt16("ban_bankID");
    int userID = reader.GetInt16("ban_userID");
    string bankUsername = reader.GetString("ban_username");
    string accountName = reader.GetString("ban_accountName");
    string accountType = reader.GetString("ban_accountType");
    decimal overdraft = reader.GetDecimal("ban_overdraft");
    char defaultAccount = reader.GetChar("ban_defaultAccount");

    string line = bankID + "\t" + userID + "\t" + bankUsername + "\t" + accountName + "\t"
              + accountType + "\t" + overdraft + "\t" + defaultAccount + "\n";

    tw.WriteLine(line);

感谢您在这个问题上的帮助。
3个回答

6

格式是正确的,CSV文件期望文件以逗号分隔。当保存Tab分隔文件时,通常只使用txt扩展名(或有些人保存为.tsv)等。

如果您查看Excel中的另存为选项,则选项为文本(制表符分隔).txt

如果我打开由您的示例代码生成的输出(插入数据),则所有内容都会像预期的那样加载到Excel 2007中。


1
+1 我一直盯着这个问题想,"输出没有任何问题,肯定是加载方式有误",但完全忽略了问题中提到使用 CSV 文件却用制表符分隔的情况。 - Andrew Barber

2
问题出在编码上。
您没有展示您的TextWriter实例化,但它应该看起来像这样:
TextWriter tw = new Stream(filename, false, Encoding.ASCII);  

此外,在将CSV导入Excel时要小心,特别是在处理银行账号等数字时,因为如果一个数字超过15位,Excel会将其视为科学计数法(指数)。 - BeemerGuy

1
你应该使用文本导入向导:数据/从文本导入。从那里,你可以将分隔符指定为制表符。

我不确定那会如何工作。写入CSV文件的目的是允许用户将数据从数据库备份到CSV文件中。因此,我的程序逐行读取数据库以将数据写入CSV文件中。 - Boardy
由于您的 .csv 文件实际上并不是“逗号”分隔的,因此您必须以某种方式告诉 Excel 您的分隔符实际上是“制表符”。如果这样做,您将看到您的文件正确导入。尝试使用逗号作为分隔符,而不是制表符。 - Erwin Alva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接