Как прочитать текстовый файл в DataTable
Я хотел бы извлечь данные из TXT-файла и поместить его в DataTable. Содержимое в текстовом файле имеет следующий формат:
sometext1: sometext2: sometext3
sometext4: sometext5: sometext6
sometext7: sometext8: sometext9
...
Каждая строка представляет строку, а каждый столбец разделен символом ":".
Я пытался сделать это:
DataTable tbl = new DataTable();
using (StreamWriter sw = File.CreateText(path))
{
string[] rows = content.Split('\n');
foreach (string s in rows)
{
string[] columns = s.Split(':');
foreach (string t in columns)
{
sw.WriteLine(t);
}
}
}
Как я могу прочитать этот файл и добавить его в DataTable?
4 ответа
Это простой способ сделать свою работу
public DataTable ConvertToDataTable (string filePath, int numberOfColumns)
{
DataTable tbl = new DataTable();
for(int col =0; col < numberOfColumns; col++)
tbl.Columns.Add(new DataColumn("Column" + (col+1).ToString()));
string[] lines = System.IO.File.ReadAllLines(filePath);
foreach(string line in lines)
{
var cols = line.Split(':');
DataRow dr = tbl.NewRow();
for(int cIndex=0; cIndex < 3; cIndex++)
{
dr[cIndex] = cols[cIndex];
}
tbl.Rows.Add(dr);
}
return tbl;
}
Вот отличный класс, который будет копировать данные CSV в таблицу данных, используя структуру данных для создания DataTable:
http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic-Parser-for-Flat-F
Эта тема также обсуждалась здесь: Как прочитать файл CSV в.NET Datatable
Однако, если вы хотите написать код самостоятельно, есть пример:
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)
Это в VB.NET, если вы не можете перевести его на C#, дайте мне знать.
С уважением.
Ну, у вас, вероятно, есть ваши данные прямо здесь:
string[] rows = content.Split('\n');
foreach (string s in rows)
{
string[] columns = s.Split(':');
foreach (string t in columns)
{
// each data element
}
}
Если у тебя есть DataTable
определено, вы можете добавить строки к нему с очень похожей конструкцией. Я не знаю структуру вашей таблицы, но по сути вы можете сделать это:
string[] rows = content.Split('\n');
foreach (string s in rows)
{
string[] columns = s.Split(':');
var dataRow = someDataTable.NewRow();
dataRow["someColumnName"] = columns[0];
dataRow["anotherColumnName"] = columns[1];
dataRow["someOtherColumnName"] = columns[2];
// and so on...
someDataTable.Rows.Add(dataRow);
}
Если DataTable
столбцы не имеют строгого имени, вы также можете добавлять элементы по индексу:
dataRow.Item[0] = columns[0];
dataRow.Item[1] = columns[1];
// and so on...
Ниже будет выполнен весь процесс, как вы обрисовали.
var table = new DataTable();
var fileContents = File.ReadAllLines("yourFile");
var splitFileContents = (from f in fileContents select f.Split(':')).ToArray();
int maxLength = (from s in splitFileContents select s.Count()).Max();
for (int i = 0; i < maxLength; i++)
{
table.Columns.Add();
}
foreach (var line in splitFileContents)
{
DataRow row = table.NewRow();
row.ItemArray = (object[])line;
table.Rows.Add(row);
}