В настоящее время я работаю над небольшим проектом, и я застрял с проблемой, которую в настоящее время не могу решить...
У меня есть несколько файлов «.CSV», которые я хочу прочитать, все они имеют одни и те же данные только с разными значениями.
Header1;Value1;Info1
Header2;Value2;Info2
Header3;Value3;Info3
При чтении первого файла мне нужно создать заголовки. Проблема в том, что они разделены не на столбцы, а на строки (как вы можете видеть выше Header1-Header3).
Затем ему нужно прочитать значение 1 - значение 3 (они перечислены во 2-м столбце), и, кроме того, мне нужно создать еще один заголовок -> заголовок4 с данными «Info2», которые всегда помещаются в столбец 3 и строку 2 (другие значения столбца 3 я могу игнорировать).
Таким образом, результат после первого файла должен выглядеть так:
Header1;Header2;Header3;Header4;
Value1;Value2;Value3;Info2;
И после нескольких файлов это должно быть так:
Header1;Header2;Header3;Header4;
Value1;Value2;Value3;Value4;
Value1b;Value2b;Value3b;Value4b;
Value1c;Value2c;Value3c;Value4c;
Я попробовал это с OleDB, но я получаю сообщение об ошибке «отсутствует ISAM», которое я не могу исправить. Код, который я использовал, следующий:
public DataTable ReadCsv(string fileName)
{
DataTable dt = new DataTable("Data");
/* using (OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"" +
Path.GetDirectoryName(fileName) + "\";Extendet Properties ='text;HDR=yes;FMT=Delimited(,)';"))
*/
using (OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
Path.GetDirectoryName(fileName) + ";Extendet Properties ='text;HDR=yes;FMT=Delimited(,)';"))
{
using(OleDbCommand cmd = new OleDbCommand(string.Format("select *from [{0}]", new FileInfo(fileName).Name,cn)))
{
cn.Open();
using(OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
{
adapter.Fill(dt);
}
}
}
return dt;
}
Еще одна попытка, которую я сделал, заключалась в использовании StreamReader. Но заголовки находятся не в том месте, и я не знаю, как это изменить + сделать это для каждого файла. Код, который я пробовал, следующий:
public static DataTable ReadCsvFilee(string path)
{
DataTable oDataTable = new DataTable();
var fileNames = Directory.GetFiles(path);
foreach (var fileName in fileNames)
{
//initialising a StreamReader type variable and will pass the file location
StreamReader oStreamReader = new StreamReader(fileName);
// CONTROLS WHETHER WE SKIP A ROW OR NOT
int RowCount = 0;
// CONTROLS WHETHER WE CREATE COLUMNS OR NOT
bool hasColumns = false;
string[] ColumnNames = null;
string[] oStreamDataValues = null;
//using while loop read the stream data till end
while (!oStreamReader.EndOfStream)
{
String oStreamRowData = oStreamReader.ReadLine().Trim();
if (oStreamRowData.Length > 0)
{
oStreamDataValues = oStreamRowData.Split(';');
//Bcoz the first row contains column names, we will poluate
//the column name by
//reading the first row and RowCount-0 will be true only once
// CHANGE TO CHECK FOR COLUMNS CREATED
if (!hasColumns)
{
ColumnNames = oStreamRowData.Split(';');
//using foreach looping through all the column names
foreach (string csvcolumn in ColumnNames)
{
DataColumn oDataColumn = new DataColumn(csvcolumn.ToUpper(), typeof(string));
//setting the default value of empty.string to newly created column
oDataColumn.DefaultValue = string.Empty;
//adding the newly created column to the table
oDataTable.Columns.Add(oDataColumn);
}
// SET COLUMNS CREATED
hasColumns = true;
// SET RowCount TO 0 SO WE KNOW TO SKIP COLUMNS LINE
RowCount = 0;
}
else
{
// IF RowCount IS 0 THEN SKIP COLUMN LINE
if (RowCount++ == 0) continue;
//creates a new DataRow with the same schema as of the oDataTable
DataRow oDataRow = oDataTable.NewRow();
//using foreach looping through all the column names
for (int i = 0; i < ColumnNames.Length; i++)
{
oDataRow[ColumnNames[i]] = oStreamDataValues[i] == null ? string.Empty : oStreamDataValues[i].ToString();
}
//adding the newly created row with data to the oDataTable
oDataTable.Rows.Add(oDataRow);
}
}
}
//close the oStreamReader object
oStreamReader.Close();
//release all the resources used by the oStreamReader object
oStreamReader.Dispose();
}
return oDataTable;
}
Я благодарен всем, кто готов помочь. И спасибо, что дочитали до этого места!
Искренне Ваш
Value4
предназначено для другого поля? - person Panagiotis Kanavos   schedule 23.03.2018Header4:Value4
и игнорирования. Возможно, это формат, который просто выглядит как CSV? - person Panagiotis Kanavos   schedule 23.03.2018