【问题标题】:Exporting table to CSV using LINQ使用 LINQ 将表导出为 CSV
【发布时间】:2014-04-24 21:17:24
【问题描述】:

我很难使用 LINQ 在 CSV 文件中导出数据库表。我已经尝试了一些相关主题的东西,但是时间太长了,我需要一个最简单的解决方案。一定有什么。 使用此代码有问题,该文件已创建,但为空。当我尝试调试时,查询很好,我想导出所有内容。我做错了什么?

private void Save_Click(object sender, RoutedEventArgs e)
    {
        StreamWriter sw = new StreamWriter("test.csv");
        DataDataContext db = new DataDataContext();

        var query = from x in db.Zbozis
                    orderby x.Id
                    select x;

        foreach (var something in query)
        {
            sw.WriteLine(something.ToString());
        }

    }

编辑:好的,我尝试了您的所有建议,遗憾的是结果相同(创建了 CSV,但其中是 10x Lekarna.Zbozi(项目名称/db + 表名称))。 所以我使用了一种我发现的方法(为什么要重新发明轮子,呵呵)。

public string ConvertToCSV(IQueryable query, string replacementDelimiter)
    {

        // Create the csv by looping through each row and then each field in each row
        // seperating the columns by commas

        // String builder for our header row
        StringBuilder header = new StringBuilder();

        // Get the properties (aka columns) to set in the header row
        PropertyInfo[] rowPropertyInfos = null;
        rowPropertyInfos = query.ElementType.GetProperties();

        // Setup header row 
        foreach (PropertyInfo info in rowPropertyInfos)
        {
            if (info.CanRead)
            {
                header.Append(info.Name + ",");
            }
        }

        // New row
        header.Append("\r\n");

        // String builder for our data rows
        StringBuilder data = new StringBuilder();

        // Setup data rows
        foreach (var myObject in query)
        {

            // Loop through fields in each row seperating each by commas and replacing 
            // any commas in each field name with replacement delimiter
            foreach (PropertyInfo info in rowPropertyInfos)
            {
                if (info.CanRead)
                {

                    // Get the fields value and then replace any commas with the replacement delimeter
                    string tmp = Convert.ToString(info.GetValue(myObject, null));
                    if (!String.IsNullOrEmpty(tmp))
                    {
                        tmp.Replace(",", replacementDelimiter);
                    }
                    data.Append(tmp + ",");
                }
            }

            // New row
            data.Append("\r\n");
        }

        // Check the data results... if they are empty then return an empty string
        // otherwise append the data to the header
        string result = data.ToString();
        if (string.IsNullOrEmpty(result) == false)
        {
            header.Append(result);
            return header.ToString();
        }
        else
        {
            return string.Empty;
        }
    }

所以我有以前代码的修改版本:

 StreamWriter sw = new StreamWriter("pokus.csv");
        ExportToCSV ex = new ExportToCSV();
        var query = from x in db.Zbozis
                    orderby x.Id
                    select x;
        string s = ex.ConvertToCSV(query,"; ");

        sw.WriteLine(s);
        sw.Flush();

一切都很好,除了它在一列中导出每一行并且不分开它。见这里->http://i.stack.imgur.com/XSNK0.jpg 那么问题就很明显了,如何像我在数据库中那样将其划分为列?

谢谢

【问题讨论】:

    标签: c# wpf linq csv


    【解决方案1】:

    您没有关闭文件。要么使用“使用”

    using(StreamWriter sw = new StreamWriter("test.csv"))
    {
         ..............
    }
    

    或者干脆试试这个

    File.WriteAllLines("test.csv",query);
    

    【讨论】:

    • 我试过了,但出现了一些其他问题。我的编辑帖子
    • @Manik I tried it, but some other problems occured 感谢这个神奇的解释。让我猜一猜:您确定您的对象(在select x; 中)正确实现了ToString()(因为您只想通过ToString() 来编写它)。否则,您必须使用一些代码将其属性显式转换为字符串。
    • 我的另一个问题在我的第一个编辑帖子中有所描述。如果我的对象实现 ToString 在这种情况下我认为不会成为问题。
    猜你喜欢
    • 2015-11-06
    • 2013-03-10
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多