保存到csv后,数据格式奇怪

时间:2017-04-04 08:47:51

标签: c# entity-framework linq streamwriter

保存到csv后的数据格式如屏幕截图所示:

enter image description here

这是我的C#代码。

$ ssh -v 127.0.0.1 -p 1222
OpenSSH_7.3p1, OpenSSL 1.0.2k  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to 127.0.0.1 [127.0.0.1] port 1222.
debug1: connect to address 127.0.0.1 port 1222: Connection refused
ssh: connect to host 127.0.0.1 port 1222: Connection refused

你知道遗失了什么或我弄错了什么吗?

更新:UserData.Properties:

enter image description here

在这里,我可以按属性选择属性:

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

但是我想要整个对象,稍后它会上传到我的应用程序。

3 个答案:

答案 0 :(得分:1)

.NET中默认的.ToString()个对象只是写入对象的全名(所以"LayoutMVVM.LinqToSqlClasses.UserData"就是这样)。您必须重载.ToString()或手动撰写数据。请注意,直接编写CSV已成熟问题......转义CSV很复杂(例如,转义This is a "quoted" string或新行)。搜索能够正确执行此操作的库。

答案 1 :(得分:1)

使用此代码

String.Join(",", usersL.Select(x => x.ToString()).ToArray());   

您正在调用ToString()个实例中的UserData方法。默认情况下,当调用它的ToString()方法时,您将获得类的命名空间。如果要在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类不应该知道它在csv文件中保存的方式。

/ edit:使用反射

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

答案 2 :(得分:1)

尝试使用以下内容:

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