C # Как читать файл с фиксированной длиной в Datatable? [Дубликат]

Вы можете использовать метод RDD groupByKey .

Вход:

data = [(1, 'a'), (1, 'b'), (2, 'c'), (2, 'd'), (2, 'e'), (3, 'f')]
rdd = sc.parallelize(data)
result = rdd.groupByKey().collect()

Выход:

[(1, ['a', 'b']), (2, ['c', 'd', 'e']), (3, ['f'])]

11
задан AlteredConcept 22 July 2009 в 16:49
поделиться

3 ответа

public System.Data.DataTable GetDataTable(string strFileName)
{
    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + ";Extended Properties = \"Text;HDR=YES;FMT=TabDelimited\"");
    conn.Open();
    string strQuery = "SELECT * FROM [" + System.IO.Path.GetFileName(strFileName) + "]";
    System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn);
    System.Data.DataSet ds = new System.Data.DataSet("CSV File");
    adapter.Fill(ds);
    conn.Close();
    return ds.Tables[0];
 }
5
ответ дан Arsen Mkrtchyan 26 August 2018 в 21:23
поделиться
  • 1
    Есть ли способ сделать это без Jet? Для тех из нас, в которых доступ запрещен. – Tom Kidd 14 September 2009 в 17:16
  • 2
    Другой способ - проанализировать файл вручную – Arsen Mkrtchyan 15 September 2009 в 06:26

В настоящее время используются методы LINQ .First() и .Skip(), которые легко воссоздать, если вам нужно использовать это на .Net 2.0

//even cooler as an extension method
static IEnumerable<string> ReadAsLines(string filename)
{
    using (var reader = new StreamReader(filename))
        while (!reader.EndOfStream)
            yield return reader.ReadLine();
}

static void Main()
{
    var filename = "tabfile.txt";
    var reader = ReadAsLines(filename);

    var data = new DataTable();

    //this assume the first record is filled with the column names
    var headers = reader.First().Split('\t');
    foreach (var header in headers)
        data.Columns.Add(header);

    var records = reader.Skip(1);
    foreach (var record in records)
        data.Rows.Add(record.Split('\t'));
}
16
ответ дан Matthew Whited 26 August 2018 в 21:23
поделиться

Вот один из способов сделать это ...

        var dt = new DataTable();
        dt.Columns.Add(new DataColumn("Column1", typeof(string)));
        dt.Columns.Add(new DataColumn("Column2", typeof(string)));
        dt.Columns.Add(new DataColumn("Column3", typeof(string)));

        var lines = File.ReadAllLines(@"c:\tabfile.txt");
        foreach( string line in lines )
            dt.Rows.Add(line.Split('\t'));
0
ответ дан Steve 26 August 2018 в 21:23
поделиться
  • 1
    если файл действительно большой, вы создаете 2 копии одного и того же большого файла в памяти – Arsen Mkrtchyan 22 July 2009 в 17:14
  • 2
    Да, я должен был упомянуть об этом. Я хотел, чтобы этот пример был простым. Чтение потока было бы более подходящим, если бы файлы были большими. – Steve 22 July 2009 в 19:47
  • 3
    это прекрасно, я использовал это для своего собственного проекта – JOE SKEET 20 December 2010 в 21:02
Другие вопросы по тегам:

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