1

我正在使用 Microsoft.Jet.OleDb.4.0 来读取 csv 文件。我比较里面的信息,如果它符合某些标准,就把它添加到下拉列表中。我的问题是 Microsoft.Jet.OleDb.4.0 仅与 x86 兼容。但是,我还有其他需要以 x64 方式运行的功能。是否有更新或替代方法来执行此操作?

下面是我的代码。如果我在 x86 中,目前可以使用。

DataTable dataTable = new DataTable("table1");
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Directory.GetCurrentDirectory() + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""))
{
    conn.Open();
    string strQuery = "SELECT * FROM [" + "report.csv" + "]";
    OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
    adapter.Fill(dataTable);
    foreach (DataRow rows in dataTable.Rows) {
        if (rows[1].ToString() == "False")
        {
            unlicensed.Items.Add(rows[0].ToString());
        }
        if (rows[2].ToString() == "False")
        {
            litigation.Items.Add(rows[0].ToString());
        }
    }
}
4

5 回答 5

0

我在另一个问题中有一些代码可以帮助你:

在 C# 中读取 CSV 文件

使用我的答案中的类,您的新代码看起来非常接近:

unlicensed.DataSource = CSV.FromFile("report.csv")
                     .Where(r => r[1] != "False").Select(r => r[0]);
litigation.DataSource = CSV.FromFile("report.csv")
                     .Where(r => r[2] != "False").Select(r => r[0]);

听起来您的“错误”标准可能有点不同,但这将非常接近结果。您可能还想在列表中使用 Append 方法。并避免另一个问题:是的,这将读取文件两次。如果这真的成为性能问题,您可以编写代码使其只读取一次,但它看起来更像您上面的内容。奇怪的是,较短代码的维护好处超过了这里的性能问题。

于 2012-07-25T18:39:34.653 回答
0

是的,有另一种方法,而不是使用 Microsoft.Jet.OleDb.4.0 您可以使用以下方法..

static void Main()
        {
            string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";

            DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);

            Console.WriteLine("Rows count:" + csvData.Rows.Count);

            Console.ReadLine();
        }


private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            DataTable csvData = new DataTable();

            try
            {

            using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                {
                    csvReader.SetDelimiters(new string[] { "," });
                    csvReader.HasFieldsEnclosedInQuotes = true;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add(datecolumn);
                    }

                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return csvData;
        }
于 2013-08-28T04:10:33.727 回答
0

我最近有这个问题。不是 Microsoft.Jet.OleDb.4.0,而是需要 x86 的依赖项,但我的应用程序的许多部分需要在 x64 中运行。我通过做两件事来解决它:

  1. 将 x86 依赖项分离到它自己的项目中。我将该项目的目标更改为 x86(并将所有其他项目目标保留为 AnyCPU - 我的应用程序被部署到 64 位服务器)

  2. 我在 GAC 中重新注册了 x86 依赖项。仍然不确定为什么这会产生很大的不同,但是这样做之后,它就起作用了。

我的猜测是这个问题需要类似的方法。此链接对我帮助很大:https ://lostechies.com/gabrielschenker/2009/10/21/force-net-application-to-run-in-32bit-process-on-64bit-os/


我探索、工作但最终没有采用的一种激进方法是将 x86 代码包装在它自己的可执行文件中,该可执行文件将输出写入控制台并使用Process.Start()ProcessStartInfo.RedirectStandardOutput尽管我不建议这样做。虽然是一个有趣的实验。

于 2016-02-03T21:14:19.633 回答
-1

尝试编译为 32 位应用程序(平台目标:构建选项中的 x86)。

于 2012-07-25T18:34:51.300 回答
-1

如果你不想被强类型化,你可以依赖 List

        public List<List<string>> ReadCsvTable(string path) {
            List<List<string>> table = new List<List<string>>();
            string[] lines = System.IO.File.ReadAllLines(path);
            foreach (string line in lines) {
                table.Add(new List<string>(line.Split(',')));
            }
            return table;
        }

如果您想特别注意下面用户突出显示的问题,则应该处理我希望的引用字段:

        public List<List<string>> ReadCsvTable(string path) {
            List<List<string>> table = new List<List<string>>();
            string[] lines = System.IO.File.ReadAllLines(path);
            foreach (string line in lines) {
                List<string> rawFields = new List<string>(line.Split(','));                
                List<string> processedFields = new List<string>();
                foreach(string field in rawFields){
                    Match m = Regex.Match("^\"?(^<value>.*)\"?$", line);
                    processedFields.Add(m.Groups["value"].Value);
                }                
                table.Add(processedFields);
            }
            return table;
        }
于 2012-07-25T18:31:42.017 回答