CSVHelper 不格式化 CSV
CSVHelper not formatting CSV
我正在使用 CSVHelper 编写一个列表<>,该列表是我通过使用 MySqlDataReader 获得的。我的问题是正确格式化我的 CSV 文件,我创建了一个映射器 class,它应该按列名指示数据的放置位置:
public ReaderMap()
{
Map(m => m.accountpersonfirstname).Name("E-mail Address");
Map(m => m.accountpersonlastname).Name("First Name");
Map(m => m.emailaddress).Name("Last Name");
}
这直接来自 http://joshclose.github.io/CsvHelper/#mapping-name。
我假设我的问题在于我的流编写器如何写入我现有的 csv,因为它每次都会创建一个新的 CSV 文件(并且我失去了我的名字)但是我也尝试过使用按索引映射也应该在新的 CSV 文件上工作,但它仍然将数据彼此紧挨着 我希望看到我的列分开几列,以便数据可读 - 我还需要 header 个名字。
这是我的两个 classes - 映射器和原始数据 class。
class Reader
{
public string emailaddress { get; set; }
public string accountpersonfirstname { get; set; }
public string accountpersonlastname { get; set; }
}
class ReaderMap : CsvClassMap<Reader>
{
public ReaderMap()
{
Map(m => m.accountpersonfirstname).Name("E-mail Address");
Map(m => m.accountpersonlastname).Name("First Name");
Map(m => m.emailaddress).Name("Last Name");
}
}
我也将粘贴我的部分代码,因为就像我上面提到的,也许我没有正确使用流编写器(即使我认为我是)。
MySqlCommand cmd = new MySqlCommand(sqlCmd, cn);
cmd.CommandType = CommandType.Text;
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Reader dataExport = new Reader();
dataExport.accountpersonfirstname = rdr.GetString(0);
dataExport.accountpersonlastname = rdr.GetString(1);
dataExport.emailaddress = rdr.GetString(2);
dataList.Add(dataExport);
}
var textWriter = new StreamWriter(filePath);
var csv = new CsvWriter(textWriter);
csv.Configuration.RegisterClassMap<ReaderMap>();
foreach (var item in dataList)
{
csv.WriteRecord(item);
}
也许问题出在我对上面的 streamwriter 的启动中,或者这一切都可以追溯到使用数据 reader - 我不完全确定。我希望有人能为我阐明这一点。
编辑:
似乎使用以下命令可以正确追加。然而,我最初的问题仍然存在,当我将 csv 文件中的 header 名字和姓氏进一步移动到 F 和 G 列时,它仍然将它们放在 B 和 C 中,就好像它完全忽略了我的 class 和我设置的配置。
var textWriter = new StreamWriter(filePath, true);
使用自定义 CsvClassMap
时,输出以每列 属性 的形式无间隙写入,除非 属性 被忽略,在这种情况下,属性 不输出,但在被忽略的地方不会产生间隙。
为了创建您想要的间隙,您需要创建一个自定义方法,以您想要的格式写出文件。
//Write out the header
var csv = new CsvWriter(textWriter);
csv.WriteField("A Column Data");
csv.WriteField("B (Empty)");
csv.WriteField("C (Empty)");
csv.WriteField("D (Empty)");
csv.WriteField("E (Empty)");
csv.WriteField("F Column Data");
csv.WriteField("G Column Data");
csv.NextRecord(); //Newline
foreach (var item in dataList)
{
csv.WriteRecord(item.PropertyA);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(item.PropertyB);
csv.WriteRecord(item.PropertyC);
csv.NextRecord();
}
说了这么多,你为什么要插入空白?插入空白不会使 csv 更具可读性,如果您在 excel 或其他电子表格应用程序中打开它,请双击右 header 边框,它会自动扩展列宽。
我正在使用 CSVHelper 编写一个列表<>,该列表是我通过使用 MySqlDataReader 获得的。我的问题是正确格式化我的 CSV 文件,我创建了一个映射器 class,它应该按列名指示数据的放置位置:
public ReaderMap()
{
Map(m => m.accountpersonfirstname).Name("E-mail Address");
Map(m => m.accountpersonlastname).Name("First Name");
Map(m => m.emailaddress).Name("Last Name");
}
这直接来自 http://joshclose.github.io/CsvHelper/#mapping-name。
我假设我的问题在于我的流编写器如何写入我现有的 csv,因为它每次都会创建一个新的 CSV 文件(并且我失去了我的名字)但是我也尝试过使用按索引映射也应该在新的 CSV 文件上工作,但它仍然将数据彼此紧挨着 我希望看到我的列分开几列,以便数据可读 - 我还需要 header 个名字。
这是我的两个 classes - 映射器和原始数据 class。
class Reader
{
public string emailaddress { get; set; }
public string accountpersonfirstname { get; set; }
public string accountpersonlastname { get; set; }
}
class ReaderMap : CsvClassMap<Reader>
{
public ReaderMap()
{
Map(m => m.accountpersonfirstname).Name("E-mail Address");
Map(m => m.accountpersonlastname).Name("First Name");
Map(m => m.emailaddress).Name("Last Name");
}
}
我也将粘贴我的部分代码,因为就像我上面提到的,也许我没有正确使用流编写器(即使我认为我是)。
MySqlCommand cmd = new MySqlCommand(sqlCmd, cn);
cmd.CommandType = CommandType.Text;
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Reader dataExport = new Reader();
dataExport.accountpersonfirstname = rdr.GetString(0);
dataExport.accountpersonlastname = rdr.GetString(1);
dataExport.emailaddress = rdr.GetString(2);
dataList.Add(dataExport);
}
var textWriter = new StreamWriter(filePath);
var csv = new CsvWriter(textWriter);
csv.Configuration.RegisterClassMap<ReaderMap>();
foreach (var item in dataList)
{
csv.WriteRecord(item);
}
也许问题出在我对上面的 streamwriter 的启动中,或者这一切都可以追溯到使用数据 reader - 我不完全确定。我希望有人能为我阐明这一点。
编辑:
似乎使用以下命令可以正确追加。然而,我最初的问题仍然存在,当我将 csv 文件中的 header 名字和姓氏进一步移动到 F 和 G 列时,它仍然将它们放在 B 和 C 中,就好像它完全忽略了我的 class 和我设置的配置。
var textWriter = new StreamWriter(filePath, true);
使用自定义 CsvClassMap
时,输出以每列 属性 的形式无间隙写入,除非 属性 被忽略,在这种情况下,属性 不输出,但在被忽略的地方不会产生间隙。
为了创建您想要的间隙,您需要创建一个自定义方法,以您想要的格式写出文件。
//Write out the header
var csv = new CsvWriter(textWriter);
csv.WriteField("A Column Data");
csv.WriteField("B (Empty)");
csv.WriteField("C (Empty)");
csv.WriteField("D (Empty)");
csv.WriteField("E (Empty)");
csv.WriteField("F Column Data");
csv.WriteField("G Column Data");
csv.NextRecord(); //Newline
foreach (var item in dataList)
{
csv.WriteRecord(item.PropertyA);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(string.Empty);
csv.WriteRecord(item.PropertyB);
csv.WriteRecord(item.PropertyC);
csv.NextRecord();
}
说了这么多,你为什么要插入空白?插入空白不会使 csv 更具可读性,如果您在 excel 或其他电子表格应用程序中打开它,请双击右 header 边框,它会自动扩展列宽。