簡體   English   中英

使用OLEDB命令讀取csv

[英]csv reading using OLEDB command

我試圖使用oledb命令讀取csv文件。 以下是我正在使用。 此代碼執行順利。 但是我需要從csv文件中刪除第一行並將第二行設置為數據表的列標題。 可能嗎?

static DataTable ImportCsvFileToDataTable(string filename, string fullPath)
{
    FileInfo file = new FileInfo(fullPath);

    using (OleDbConnection con =
               new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" +
               file.DirectoryName + "\";Extended Properties='text;HDR=Yes;FMT=Delimited(,)';"))
    {
        using (OleDbCommand cmd = new OleDbCommand(string.Format
                                  ("SELECT * FROM [{0}]", file.Name), con))
        {
            con.Open();

            // Using a DataTable to process the data
            using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
            {
                DataTable tbl = new DataTable(filename);
                adp.Fill(tbl);
                return tbl;
            }
        }
    }
}

我試圖開發將CSV導入DataTable的完美方法。 這是結果。 它將第一行解析為列標題。 這種方法適用於Ace OleDB 12,但也可以使用Jet OleDB 4。

public static DataTable FromCSV(string FilePath, char Delimiter = ',')
{
    DataTable dt = new DataTable();
    Dictionary<string, string> props = new Dictionary<string, string>();

    if (!File.Exists(FilePath))
        return null;

    if (FilePath.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
    {
        props["Provider"] = "Microsoft.Ace.OLEDB.12.0";
        props["Extended Properties"] = "\"Text;FMT=Delimited\"";
        props["Data Source"] = Path.GetDirectoryName(FilePath);
    }
    else
        return null;

    StringBuilder sb = new StringBuilder();

    foreach (KeyValuePair<string, string> prop in props)
    {
        sb.Append(prop.Key);
        sb.Append('=');
        sb.Append(prop.Value);
        sb.Append(';');
    }

    string connectionString = sb.ToString();

    File.Delete(Path.GetDirectoryName(FilePath) + "/schema.ini");
    using (StreamWriter sw = new StreamWriter(Path.GetDirectoryName(FilePath) + "/schema.ini", false))
    {
        sw.WriteLine("[" + Path.GetFileName(FilePath) + "]");
        sw.WriteLine("Format=Delimited(" + Delimiter + ")");
        sw.WriteLine("DecimalSymbol=.");
        sw.WriteLine("ColNameHeader=True");
        sw.WriteLine("MaxScanRows=1");
        sw.Close();
        sw.Dispose();
    }

    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        conn.Open();
        OleDbCommand cmd = new OleDbCommand();
        cmd.Connection = conn;
        cmd.CommandText = "SELECT * FROM [" + Path.GetFileName(FilePath) + "] WHERE 1=0";
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        da.Fill(dt);

        using (StreamWriter sw = new StreamWriter(Path.GetDirectoryName(FilePath) + "/schema.ini", true))
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                string NewColumnName = dt.Columns[i].ColumnName.Replace(@"""", @"""""");
                int ColumnNamePosition = NewColumnName.LastIndexOf("#csv.", StringComparison.OrdinalIgnoreCase);
                if (ColumnNamePosition != -1)
                    NewColumnName = NewColumnName.Substring(ColumnNamePosition + "#csv.".Length);
                if (NewColumnName.StartsWith("NoName"))
                    NewColumnName = "F" + (i + 1).ToString();
                sw.WriteLine("col" + (i + 1).ToString() + "=" + NewColumnName + " Text");
            }   
            sw.Close();
            sw.Dispose();
        }

        dt.Columns.Clear();
        cmd.CommandText = "SELECT * FROM [" + Path.GetFileName(FilePath) + "]";
        da = new OleDbDataAdapter(cmd);
        da.Fill(dt);
        cmd = null;
        conn.Close();
    }

    File.Delete(Path.GetDirectoryName(FilePath) + "/schema.ini");
    return dt;
}

也許是這樣的:

    tbl.Rows[0].Delete();
    DataRow r = tbl.Rows[0];
    foreach(DataColumn c in tbl.Columns)
    {
        tbl.Columns[c.ColumnName].ColumnName = r[c.ColumnName].ToString();

     }
     tbl.Rows[0].Delete();

沒有內置方法告訴OLEDB將第二行用於標題而不是第一行。

您必須打開CSV文件,遠程第一行,然后再次保存。 幸運的是,這很容易做到:

var lines = File.ReadAllLines(oldFileName);
File.WriteAllLines(newFileName, lines.Skip(1));

(如果您使用的是.NET版本<4,請在Skip(1) .ToArray()后添加.ToArray() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM