Парсер CSV для парсинга двойных кавычек через OLEDB - PullRequest
0 голосов
/ 21 октября 2011

Как я могу использовать OLEDB для анализа и импорта файла CSV, в котором каждая ячейка заключена в двойные кавычки, потому что некоторые строки содержат запятые в них ?? Я не могу изменить формат, так как он исходит от поставщика.

Я пытаюсь выполнить следующее, и это приводит к ошибке ввода-вывода:

public DataTable ConvertToDataTable(string fileToImport, string fileDestination)
{
    string fullImportPath = fileDestination + @"\" + fileToImport;
    OleDbDataAdapter dAdapter = null;
    DataTable dTable = null;

    try
    {
        if (!File.Exists(fullImportPath))
            return null;

        string full = Path.GetFullPath(fullImportPath);
        string file = Path.GetFileName(full);
        string dir = Path.GetDirectoryName(full);


        //create the "database" connection string
        string connString = "Provider=Microsoft.Jet.OLEDB.4.0;"
          + "Data Source=\"" + dir + "\\\";"
          + "Extended Properties=\"text;HDR=No;FMT=Delimited\"";

        //create the database query
        string query = "SELECT * FROM " + file;

        //create a DataTable to hold the query results
        dTable = new DataTable();

        //create an OleDbDataAdapter to execute the query
        dAdapter = new OleDbDataAdapter(query, connString);


        //fill the DataTable
        dAdapter.Fill(dTable);
    }
    catch (Exception ex)
    {
        throw new Exception(CLASS_NAME + ".ConvertToDataTable: Caught Exception: " + ex);
    }
    finally
    {
        if (dAdapter != null)
            dAdapter.Dispose();
    }

    return dTable;
}

Когда я использую обычный CSV, он работает нормально. Нужно ли что-то изменить в connString ??

Ответы [ 8 ]

3 голосов
/ 22 октября 2011

Используйте выделенный анализатор CSV.

Их много.Популярным является FileHelpers , хотя в пространстве имен Microsoft.VisualBasic.FileIO есть один скрытый - TextFieldParser.

1 голос
/ 16 августа 2014

При работе с CSV-файлами нужно учитывать множество факторов. Однако, извлекая их из файла, вы должны знать, как вы обрабатываете синтаксический анализ. Существуют классы, которые могут помочь вам частично, но большинство из них не обрабатывают нюансы, которые делает Excel со встроенными запятыми, кавычками и переносами строк. Тем не менее, загрузка Excel или классов MS кажется слишком сложной, если вы просто хотите проанализировать текстовый файл, например CSV.

Одна вещь, которую вы можете рассмотреть, это выполнить синтаксический анализ в вашем собственном Regex, что также сделает ваш код немного более независимым от платформы, на случай, если вам потребуется перенести его на другой сервер или приложение в какой-то момент. Преимущество использования регулярных выражений также в том, что они доступны практически на любом языке. Тем не менее, есть несколько хороших шаблонов регулярных выражений, которые решают загадку CSV. Вот мой снимок, который охватывает запятые, кавычки и переносы строк. Код / шаблон Regex и объяснение:

http://www.kimgentes.com/worshiptech-web-tools-page/2008/10/14/regex-pattern-for-parsing-csv-files-with-embedded-commas-dou.html

Надеюсь, что это поможет ...

1 голос
/ 31 мая 2014

Вы можете использовать этот код: MS Office требуется

  private void ConvertCSVtoExcel(string filePath = @"E:\nucc_taxonomy_140.csv", string tableName = "TempTaxonomyCodes")
    {
        string tempPath = System.IO.Path.GetDirectoryName(filePath);
        string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + tempPath + @"\;Extensions=asc,csv,tab,txt";
        OdbcConnection conn = new OdbcConnection(strConn);
        OdbcDataAdapter da = new OdbcDataAdapter("Select * from " + System.IO.Path.GetFileName(filePath), conn);
        DataTable dt = new DataTable();
        da.Fill(dt);

        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(ConfigurationSettings.AppSettings["dbConnectionString"]))
        {
            bulkCopy.DestinationTableName = tableName;
            bulkCopy.BatchSize = 50;
            bulkCopy.WriteToServer(dt);
        }

    }
1 голос
/ 21 октября 2011

Посмотрите на FileHelpers.

0 голосов
/ 21 октября 2014
 private static void Mubashir_CSVParser(string s)
        {
            // extract the fields
            Regex RegexCSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
            String[] Fields = RegexCSVParser.Split(s);

            // clean up the fields (remove " and leading spaces)
            for (int i = 0; i < Fields.Length; i++)
            {
                Fields[i] = Fields[i].TrimStart(' ', '"');
                Fields[i] = Fields[i].TrimEnd('"');// this line remove the quotes
                //Fields[i] = Fields[i].Trim();
            }
        }
0 голосов
/ 13 сентября 2013

Это то, что я использовал в проекте, анализирует одну строку данных.

    private string[] csvParser(string csv, char separator = ',')
    {
        List <string> parsed = new List<string>();
        string[] temp = csv.Split(separator);
        int counter = 0;
        string data = string.Empty;
        while (counter < temp.Length)
        {
            data = temp[counter].Trim();
            if (data.Trim().StartsWith("\""))
            {
                bool isLast = false;
                while (!isLast && counter < temp.Length)
                {
                    data += separator.ToString() + temp[counter + 1];
                    counter++;
                    isLast = (temp[counter].Trim().EndsWith("\""));
                }
            }
            parsed.Add(data);
            counter++;
        }

        return parsed.ToArray();

    }

http://zamirsblog.blogspot.com/2013/09/c-csv-parser-csvparser.html

0 голосов
/ 26 октября 2011

Просто если у кого-то есть похожая проблема, я хотел опубликовать код, который использовал. в итоге я использовал Textparser, чтобы получить файл и разобрать столбцы, но я использую recrusion, чтобы получить все остальное и подстроки.

 /// <summary>
        /// Parses each string passed as a "row".
        /// This routine accounts for both double quotes
        /// as well as commas currently, but can be added to
        /// </summary>
        /// <param name="row"> string or row to be parsed</param>
        /// <returns></returns>
        private List<String> ParseRowToList(String row)
        {
            List<String> returnValue = new List<String>();

            if (row[0] == '\"')
            {// Quoted String
                if (row.IndexOf("\",") > -1)
                {// There are more columns
                    returnValue = ParseRowToList(row.Substring(row.IndexOf("\",") + 2));
                    returnValue.Insert(0, row.Substring(1, row.IndexOf("\",") - 1));
                }
                else
                {// This is the last column
                    returnValue.Add(row.Substring(1, row.Length - 2));
                }
            }
            else
            {// Unquoted String
                if (row.IndexOf(",") > -1)
                {// There are more columns
                    returnValue = ParseRowToList(row.Substring(row.IndexOf(",") + 1));
                    returnValue.Insert(0, row.Substring(0, row.IndexOf(",")));
                }
                else
                {// This is the last column
                    returnValue.Add(row.Substring(0, row.Length));
                }
            }

            return returnValue;

        }

Тогда код для Textparser:

 // string pathFile = @"C:\TestFTP\TestCatalog.txt";
            string pathFile = @"C:\TestFTP\SomeFile.csv";

            List<String> stringList = new List<String>();
            TextFieldParser fieldParser = null;
            DataTable dtable = new DataTable();

            /* Set up TextFieldParser
                *  use the correct delimiter provided
                *  and path */
            fieldParser = new TextFieldParser(pathFile);
            /* Set that there are quotes in the file for fields and or column names */
            fieldParser.HasFieldsEnclosedInQuotes = true;

            /* delimiter by default to be used first */
            fieldParser.SetDelimiters(new string[] { "," });

            // Build Full table to be imported
            dtable = BuildDataTable(fieldParser, dtable);
0 голосов
/ 21 октября 2011

Попробуйте код из моего ответа здесь:

Чтение файлов CSV в C #

Отлично обрабатывает CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...