保存到 csv 后数据有奇怪的格式
Data has strange format after saved to csv
保存到 csv 后的数据格式如屏幕截图所示:
这是我的 C# 代码。
UserDataDBsDataContext dataContext = new UserDataDBsDataContext();
List<UserData> usersL = (from u in dataContext.UserDatas
//where u.Id.Equals(13)
select u).ToList();
StreamWriter writer = new StreamWriter("my_data.txt");
string csv = String.Join(",", usersL.Select(x => x.ToString()).ToArray());
writer.Write(csv);
writer.Close();
你知道我遗漏了什么或者我做错了什么吗?
更新:UserData.Properties:
在这里我可以 select 属性 通过 属性:
foreach (var i in usersL)
{
writer.Write(i.Id);
}
但我想获取整个对象,因为稍后它会上传到我的应用程序。
.NET 中对象的默认 .ToString()
只写对象的全名(因此在您的情况下 "LayoutMVVM.LinqToSqlClasses.UserData"
)。您必须重载 .ToString()
或手动编写数据。请注意,直接编写 CSV 很容易出现问题……转义 CSV 很复杂(例如转义 This is a "quoted" string
或换行)。搜索正确执行此操作的库。
使用此代码
String.Join(",", usersL.Select(x => x.ToString()).ToArray());
您正在从 UserData
个实例中调用 ToString()
方法。默认情况下,您将在调用 ToString()
方法时获得 class 的命名空间。如果您想将数据写入您的 csv 文件,您必须从您的实例中获取值。
一种方法是使用此代码
var lines = usersL.Select(x => string.Format("{0},{1},{2},{3}", x.Id, x.FirstName, x.LastName, x.Type))
.ToList();
File.WriteAllLines("my_data.txt", lines);
您也可以覆盖 UserData 的 ToString() 方法。但是,在我看来,这不是一种干净的方式,因为 UserData class 不应该知道它在 csv 文件中的保存方式。
/编辑:使用反射
var properties = typeof(UserData).GetProperties();
var userValues = new List<string>();
foreach (var user in usersL)
{
var values = new List<object>();
foreach (var property in properties)
{
object value = property.GetValue(user, null);
values.Add(value);
}
userValues.Add(string.Join(",", values));
}
File.WriteAllLines("my_data.txt", userValues);
尝试使用这样的东西:
Type t = typeof(UserData);
PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);
using(StreamWriter writer = new StreamWriter("my_data.txt"))
{
foreach(var user in usersL)
{
List<object> propValues = new List<object>();
foreach(var pi in propInfos)
{
propValues.Add(pi.GetValue(user, null));
}
string csvLine = String.Join(",", propValues);
writer.WriteLine(csvLine);
}
}
保存到 csv 后的数据格式如屏幕截图所示:
这是我的 C# 代码。
UserDataDBsDataContext dataContext = new UserDataDBsDataContext();
List<UserData> usersL = (from u in dataContext.UserDatas
//where u.Id.Equals(13)
select u).ToList();
StreamWriter writer = new StreamWriter("my_data.txt");
string csv = String.Join(",", usersL.Select(x => x.ToString()).ToArray());
writer.Write(csv);
writer.Close();
你知道我遗漏了什么或者我做错了什么吗?
更新:UserData.Properties:
在这里我可以 select 属性 通过 属性:
foreach (var i in usersL)
{
writer.Write(i.Id);
}
但我想获取整个对象,因为稍后它会上传到我的应用程序。
.NET 中对象的默认 .ToString()
只写对象的全名(因此在您的情况下 "LayoutMVVM.LinqToSqlClasses.UserData"
)。您必须重载 .ToString()
或手动编写数据。请注意,直接编写 CSV 很容易出现问题……转义 CSV 很复杂(例如转义 This is a "quoted" string
或换行)。搜索正确执行此操作的库。
使用此代码
String.Join(",", usersL.Select(x => x.ToString()).ToArray());
您正在从 UserData
个实例中调用 ToString()
方法。默认情况下,您将在调用 ToString()
方法时获得 class 的命名空间。如果您想将数据写入您的 csv 文件,您必须从您的实例中获取值。
一种方法是使用此代码
var lines = usersL.Select(x => string.Format("{0},{1},{2},{3}", x.Id, x.FirstName, x.LastName, x.Type))
.ToList();
File.WriteAllLines("my_data.txt", lines);
您也可以覆盖 UserData 的 ToString() 方法。但是,在我看来,这不是一种干净的方式,因为 UserData class 不应该知道它在 csv 文件中的保存方式。
/编辑:使用反射
var properties = typeof(UserData).GetProperties();
var userValues = new List<string>();
foreach (var user in usersL)
{
var values = new List<object>();
foreach (var property in properties)
{
object value = property.GetValue(user, null);
values.Add(value);
}
userValues.Add(string.Join(",", values));
}
File.WriteAllLines("my_data.txt", userValues);
尝试使用这样的东西:
Type t = typeof(UserData);
PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);
using(StreamWriter writer = new StreamWriter("my_data.txt"))
{
foreach(var user in usersL)
{
List<object> propValues = new List<object>();
foreach(var pi in propInfos)
{
propValues.Add(pi.GetValue(user, null));
}
string csvLine = String.Join(",", propValues);
writer.WriteLine(csvLine);
}
}