使用 LINQ 将 SQL 表转换为 CSV

问题描述 投票:0回答:4

我正在尝试将表格放入逗号分隔的 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 罚款。但我的问题是,是否有一种更简化的方法可以实现此无需单独指定每一列?在某些情况下,我想做一个“全选”,但由于表格有很多列,这看起来有点笨拙。

c# linq-to-sql csv
4个回答
3
投票

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,然后循环遍历 Customer 中的每个属性并写入值。这是假设您希望将客户的每个属性写入 CSV 文件。这至少应该给你关于如何做你想要完成的事情的想法。


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); } }

您可以轻松地使其更加通用,但随后您将需要缓存反射的 PropertyInfo 以避免在类型上大量使用反射。

警告

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


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); }



0
投票

await conn.OpenAsync(token).ConfigureAwait(false); const string Sql = "SELECT * FROM table_name;"; DataTable dataTable = new DataTable(); using var command = new SqlCommand(Sql, conn); using var reader = await command.ExecuteReaderAsync(token); dataTable.Load(reader); var columns = dataTable.Columns.Cast<DataColumn>() .Select(c => c.ColumnName); var results = dataTable.Rows.Cast<DataRow>() .Select(row => columns.ToDictionary(column => column, column => row[column])); var head_str = string.Join(";", columns.Values))); var result_str = string.Join("\r\n", results.Select(t => string.Join(";", t.Values)));

© www.soinside.com 2019 - 2024. All rights reserved.