gpt4 book ai didi

c# - CSV 字符串的通用列表

转载 作者:太空狗 更新时间:2023-10-29 20:52:58 25 4
gpt4 key购买 nike

我有一个要写入 CSV 字符串的列表。

我找到的示例似乎都是针对单个项目列表的,我的示例有多个项目。

我目前的代码是;

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") where T : ExcelReport, new()
{
var objectType = typeof(T);
var properties = objectType.GetProperties();
var currentRow = 0;
var returnString = "";
foreach (var row in data)
{
var currentColumn = 0;
var lineString = "";
foreach (var info in properties)
{
lineString = lineString + info.GetValue(row, null) + seperator;
currentColumn++;
}
if (seperator != "")
{
lineString = lineString.Substring(0, lineString.Count() - 2);
}
returnString = returnString + Environment.NewLine + lineString;
currentRow++;
}
return returnString;
}

但是当列表很大时,这个方法需要很长时间才能运行。

我的列表所基于的类看起来像;

internal class ClientMasterFile
{
public String COL1{ get; set; }
public String COL2{ get; set; }
public String COL3{ get; set; }
public String COL4{ get; set; }
public String COL5{ get; set; }
public String COL6{ get; set; }
public String COL7{ get; set; }
public String COL8{ get; set; }
public String COL9{ get; set; }
public String COL10{ get; set; }
public String COL11{ get; set; }
public String COL12{ get; set; }
}

使用高级版本的 String.Join 是否有更快的方法来执行此操作?

谢谢

最佳答案

可以使用 StringBuilder 简化您的方法和 string.Join .

直接连接字符串很慢,而且会占用大量内存,这对小操作来说很好。

参见:Does StringBuilder use more memory than String concatenation?

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",")
{
var properties = typeof(T).GetProperties();
var result = new StringBuilder();

foreach (var row in data)
{
var values = properties.Select(p => p.GetValue(row, null));
var line = string.Join(seperator, values);
result.AppendLine(line);
}

return result.ToString();
}

更完整的 CSV 实现:

private static string CreateCSVTextFile<T>(List<T> data)
{
var properties = typeof(T).GetProperties();
var result = new StringBuilder();

foreach (var row in data)
{
var values = properties.Select(p => p.GetValue(row, null))
.Select(v => StringToCSVCell(Convert.ToString(v)));
var line = string.Join(",", values);
result.AppendLine(line);
}

return result.ToString();
}

private static string StringToCSVCell(string str)
{
bool mustQuote = (str.Contains(",") || str.Contains("\"") || str.Contains("\r") || str.Contains("\n"));
if (mustQuote)
{
StringBuilder sb = new StringBuilder();
sb.Append("\"");
foreach (char nextChar in str)
{
sb.Append(nextChar);
if (nextChar == '"')
sb.Append("\"");
}
sb.Append("\"");
return sb.ToString();
}

return str;
}

使用:escaping tricky string to CSV format

关于c# - CSV 字符串的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17698228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com