当它不是标题行时从CSV获取第一行

时间:2011-01-21 10:10:16

标签: c# .net csv odbc

在我的网站上,我正在阅读CSV文件并进行解析。现在CSV没有列名。它只是逗号分隔值的原始列表。

我拿这个文件并使用ODBCDataReader类来读取行。

问题在于,当我检索第一个值时,它会跳过CSV的第一行。这可能是因为它将第一行视为列标题。但在我的情况下,没有列标题。所以每次跳过我的第一行。

如何检索CSV的第一行?

以下是我的CSV的屏幕截图:

alt text

以下是我用来解析CSV的代码。

public string CsvParser()    
{    
    int _nNrRowsProccessed = 0;
    string connectionString = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationManager.AppSettings["CSVFolder"] + ";";     
    OdbcConnection conn = new OdbcConnection(connectionString);     
    try
    {
        conn.Open();

        string strFileName = ConfigurationManager.AppSettings["CSVFile"];
        string strSQL = "Select * from " + strFileName;

        OdbcCommand cmd = new OdbcCommand();
        cmd.Connection = conn;
        cmd.CommandText = strSQL;
        cmd.CommandType = CommandType.Text;

        OdbcDataReader reader = cmd.ExecuteReader();
        string strLine = null;

        // MasterCalendar_DB.OpenMySQLConnection();

        while (reader.Read())
        {
            // insert data into mastercalendar
            strLine = reader[0].ToString();
            string strLine1 = reader[1].ToString();
            string strLine2 = reader[2].ToString();
            string strLine3 = reader[3].ToString();
            string[] arLine = strLine.Split(';');

           // string strAgencyPropertyID = arLine[0];
           // DateTime dt = DateTime.Parse(arLine[1]);
           // Int64 nDate = (Int64)Util.ConvertToUnixTimestamp(dt);
           // String strAvailability = (arLine[2]);

            _nNrRowsProccessed++;
           // MasterCalendar_DB.Insert(strAgencyPropertyID, nDate, strAvailability);
        }     
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        conn.Close();
       // MasterCalendar_DB.CloseMySQLConnection();
    }
    return "Success";
}

4 个答案:

答案 0 :(得分:3)

您想查看the page of the Text-Driver over at connectionstrings.org

基本上,您在同一目录中创建schema.ini,该目录包含不同的选项。其中一个是ColNameHeader选项,它采用布尔值。

网站示例:

[customers.txt]
Format=TabDelimited
ColNameHeader=True
MaxScanRows=0
CharacterSet=ANSI

答案 1 :(得分:2)

请检查:Schema.ini File (Text File Driver)

您可能需要设置ColNameHeader = false

答案 2 :(得分:0)

引用Microsoft.VisualBasic,你可以使用TextFieldParser,它几​​乎肯定比你提出的方法具有更少的依赖性。

using (var parser =
    new TextFieldParser(@"c:\data.csv")
        {
            TextFieldType = FieldType.Delimited,
            Delimiters = new[] { "," }
        })
{
    while (!parser.EndOfData)
    {
        string[] fields;
        fields = parser.ReadFields();
        //go go go!
    }
}

答案 3 :(得分:0)

快速而肮脏的解决方案:

string strLine  = reader.GetName(0);
string strLine1 = reader.GetName(1);
string strLine2 = reader.GetName(2);
string strLine3 = reader.GetName(3);

reader.GetName(int i); //获取指定列的名称。