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