Как прочитать файл CSV в Таблицу данных.NET

  • Вскоре мы собираемся запрограммировать в мир без баз данных .

  • АОП и внедрение зависимостей являются GOTO 21-го века .

  • Создание программного обеспечения является социальной деятельностью , а не техническим.

  • У Джоэла есть блог.

160
задан Aurora0001 19 August 2017 в 14:00
поделиться

5 ответов

Вот отличный класс, который будет копировать данные CSV в таблицу данных, используя структуру данных для создания DataTable:

Портативный и эффективный универсальный синтаксический анализатор для плоских файлов

Его легко настроить и легко использовать. Я призываю вас взглянуть.

86
ответ дан 23 November 2019 в 21:31
поделиться

Я использовал поставщика OleDb . Однако возникают проблемы, если вы читаете строки с числовыми значениями, но хотите, чтобы они обрабатывались как текст. Однако эту проблему можно обойти, создав файл schema.ini . Вот мой метод, который я использовал:

// using System.Data;
// using System.Data.OleDb;
// using System.Globalization;
// using System.IO;

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
    string header = isFirstRowHeader ? "Yes" : "No";

    string pathOnly = Path.GetDirectoryName(path);
    string fileName = Path.GetFileName(path);

    string sql = @"SELECT * FROM [" + fileName + "]";

    using(OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
              ";Extended Properties=\"Text;HDR=" + header + "\""))
    using(OleDbCommand command = new OleDbCommand(sql, connection))
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
    {
        DataTable dataTable = new DataTable();
        dataTable.Locale = CultureInfo.CurrentCulture;
        adapter.Fill(dataTable);
        return dataTable;
    }
}
91
ответ дан 23 November 2019 в 21:31
поделиться

Вот решение, использующее текстовый драйвер ODBC ADO.Net:

Dim csvFileFolder As String = "C:\YourFileFolder"
Dim csvFileName As String = "YourFile.csv"

'Note that the folder is specified in the connection string,
'not the file. That's specified in the SELECT query, later.
Dim connString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
    & csvFileFolder & ";Extended Properties=""Text;HDR=No;FMT=Delimited"""
Dim conn As New Odbc.OdbcConnection(connString)

'Open a data adapter, specifying the file name to load
Dim da As New Odbc.OdbcDataAdapter("SELECT * FROM [" & csvFileName & "]", conn)
'Then fill a data table, which can be bound to a grid
Dim dt As New DataTableda.Fill(dt)

grdCSVData.DataSource = dt

После заполнения вы можете оценить свойства таблицы данных, например ColumnName, чтобы использовать все возможности ADO.Net объекты данных.

В VS2008 вы можете использовать Linq для достижения того же эффекта.

ПРИМЕЧАНИЕ: Это может быть дубликатом этого SO вопроса.

2
ответ дан 23 November 2019 в 21:31
поделиться

Это относительно нормально и иногда может быть жалобой членов нашей команды, если проекты продолжаются в течение длительного периода времени.

Ключ к тому, о чем мы здесь говорим, - это устойчивый темп . Если вы и ваша команда способны поддерживать свой темп в течение длительного времени, это прекрасно - вы достигли гиперпродуктивности, к которой стремятся все команды Scrum.

Или же, если вы обнаружите, что переоцениваете объем работы вы можете сделать это за день, тогда вам, возможно, придется переоценить это во время ретроспективы. Количество продуктивного времени в день, которое команда решает учитывать при планировании своих возможностей для спринта, называется фокусным фактором .

Хенрик Книберг говорит следующее:

Фактор фокусировки по умолчанию, который я использую для Если вы обнаружите, что переоцениваете, сколько работы вы можете сделать за день, вам, возможно, придется переоценить это во время ретроспективы. Количество продуктивного времени в день, которое команда решает учитывать при планировании своих возможностей для спринта, называется фокусным фактором .

Хенрик Книберг говорит следующее:

Фактор фокусировки по умолчанию, который я использую для Если вы обнаружите, что переоцениваете, сколько работы вы можете сделать за день, вам, возможно, придется переоценить это во время ретроспективы. Количество продуктивного времени в день, которое команда решает учитывать при планировании своих возможностей для спринта, называется фокусным фактором .

Хенрик Книберг говорит следующее:

Фактор фокусировки по умолчанию, который я использую для новых команд обычно 70%, так как это то место, где у большинства других наших команд закончилось со временем.

http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.pdf

Однако то, о чем вы говорите, похоже, это просто непрерывный импульс спринта за спринтом, а не обязательно ваша продуктивность за день. Вот несколько советов, которые мы пытались решить с этим:

  • Завершите спринт в пятницу утром. Проведите обзор и ретроспективу вашего спринта утром, а оставшуюся часть дня позвольте команде поработать над чем-нибудь другим, чтобы очистить голову. Начнем с планирования спринта в понедельник.
  • Мы ввели понятие «лабораторные дни». Это целые дни, когда команду отвлекают от проекта, и они проводят день, работая над улучшением своих технических навыков путем совместных исследований и сотрудничества по конкретным техническим темам. //github.com/Core-Techs/Common/blob/master/CoreTechs.Common/Text/DelimitedTextExtensions.cs#L22

    https://www.nuget.org/packages/CoreTechs.Common/

    UPDATE 20.02.2015

    Пример:

    var csv = @"Name, Age
    Ronnie, 30
    Mark, 40
    Ace, 50";
    
    TextReader reader = new StringReader(csv);
    var table = new DataTable();
    using(var it = reader.ReadCsvWithHeader().GetEnumerator())
    {
    
        if (!it.MoveNext()) return;
    
        foreach (var k in it.Current.Keys)
            table.Columns.Add(k);
    
        do
        {
            var row = table.NewRow();
            foreach (var k in it.Current.Keys)
                row[k] = it.Current[k];
    
            table.Rows.Add(row);
    
        } while (it.MoveNext());
    }
    
40
ответ дан 23 November 2019 в 21:31
поделиться

Мы всегда использовали драйвер Jet.OLEDB, пока не перешли на 64-битные приложения. Microsoft не имеет и не будет выпускать 64-битный драйвер Jet. Вот простое решение, которое мы придумали, которое использует File.ReadAllLines и String.Split для чтения и анализа CSV-файла и ручной загрузки DataTable. Как отмечалось выше, он НЕ обрабатывает ситуацию, когда одно из значений столбца содержит запятую. Мы используем это в основном для чтения пользовательских файлов конфигурации - хорошая часть использования файлов CSV заключается в том, что мы можем редактировать их в Excel.

string CSVFilePathName = @"C:\test.csv";
string[] Lines = File.ReadAllLines(CSVFilePathName);
string[] Fields;
Fields = Lines[0].Split(new char[] { ',' });
int Cols = Fields.GetLength(0);
DataTable dt = new DataTable();
//1st row must be column names; force lower case to ensure matching later on.
for (int i = 0; i < Cols; i++)
    dt.Columns.Add(Fields[i].ToLower(), typeof(string));
DataRow Row;
for (int i = 1; i < Lines.GetLength(0); i++)
{
    Fields = Lines[i].Split(new char[] { ',' });
    Row = dt.NewRow();
    for (int f = 0; f < Cols; f++)
        Row[f] = Fields[f];
    dt.Rows.Add(Row);
}
13
ответ дан 23 November 2019 в 21:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: