2

我正在尝试将表格放入逗号分隔的 CSV 文件中。我目前正在这样实现它:

var csv = new StringBuilder("id,Name,Address,City,State\n");
var delimiter = ",";
var newline = "\n";

using (var db = MyDatabase())
{
     var query = from c in db.Customers select c;
     foreach(var q in query)
         csv.Append(q.id).Append(delimiter)
             .Append(q.name).Append(delimiter)
             .Append(q.address).Append(delimiter)
             .Append(q.city).Append(delimiter)
             .Append(q.state).Append(newline);
}

这会创建一个 csv 罚款。但我的问题是,是否有一种更简化的方式可以在单独指定每一列的情况下实现这一目标?在某些情况下,我想做一个select all,但是表格有很多列,这似乎有点笨拙。

4

3 回答 3

3

为了在不指定要写入 CSV 的每个属性的情况下执行此操作,您需要使用反射。这是一个如何做到这一点的基本示例:

List<Customer> query = from c in db.Customers select c;
        foreach (var q in query)
        {
            Type type = typeof(Customer);
            PropertyInfo[] properties = type.GetProperties();
            foreach (PropertyInfo property in properties)
            {
                string value = property.GetValue(type, null) != null
                    ? property.GetValue(type, null).ToString() 
                    : string.Empty; // or whatever you want the default text to be
                csv.Append(q.id).Append(delimiter);
            }
        }

这将遍历查询中的每个客户,然后遍历客户中的每个属性并写入值。这是假设您希望将 Customer 的每个属性写入 CSV 文件。这至少应该让你知道如何做你想要完成的事情。

于 2012-07-09T05:56:48.557 回答
1

您想要实现的最短路径可能是:

var props = typeof(Customer).GetProperties(
          BindingFlags.Instance|BindingFlags.Public
      );

StringBuilder result = new StringBuilder(
         (
             from prop in props select prop.Name
         ).Join(',') + "\n"
     );

Function<string,Customer> project = ( 
   Customer c => (
           from prop in props 
           select prop.GetValue(c).ToString()
       ).Join(",")+"\n";
)

using (var db = MyDatabase())
{
    var query = from c in db.Customers select project(c);
    foreach (var res in query) {
        result.append(res);
    }
}

您可以轻松地使其更通用,但是您需要缓存反射的 PropertyInfos 以避免大量使用类型上的反射。

警告:您应该正确转义属性值,因为换行符、逗号、引号等可能会破坏您的 CSV 文件。更好的是,使用已经解决了编写正确 CSV 文件问题的库。

于 2012-07-09T06:14:38.747 回答
1

我使用这段代码:

string delimiter = "|";
string newLine = Environment.NewLine;

using (mCustDataContext = new CustDataContext()) {
    var props = typeof(Customer).GetProperties();

    StringBuilder headers = new StringBuilder(string.Join(delimiter, props.Select(c => c.Name).ToArray()) + newLine);

    Func<Customer, string> myFunc = c => 
         string.Join(delimiter, props.Select(b => b.GetValue(c,null))) + newLine;

    var query = mCustDataContext.Customers.Select(myFunc);

    foreach(var q in query)
        headers.Append(q);

    File.WriteAllText(yourFileName, headers.ToString(), mEncoding);
}
于 2013-04-15T04:32:28.407 回答