在下面提到的代码中,我试图将一个大CSV文件导入数据表,并在其中添加第一行作为标题。导入时,如果包含某些文本字符串,我将跳过某些标题。 如果标题丢失,我想跳过行值。请帮助。 这是我的代码。
private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
DataTable csvData = new DataTable();
try
{
using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
{
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
string[] colFields = csvReader.ReadFields();
foreach (string column in colFields)
{
if (column.Contains("code"))
{
//here i am skipping a column if it contains the string
continue;
}
else if (column.Contains("Q"))
{
continue;
}
else if (column.Contains("M"))
{
continue;
}
DataColumn datecolumn = new DataColumn(column);
datecolumn.AllowDBNull = true;
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields();
//Making empty value as null
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
return csvData;
}
答案 0 :(得分:2)
您需要存储跳过的列,例如,通过这种方式:
List<int> skippedColumnOrdinals = new List<int>();
string[] skipWhenContains = { "code", "Q", "M" };
for (int index = 0; index < colFields.Length; index++)
{
string column = colFields[index];
bool skipColumn = skipWhenContains.Any(column.Contains);
if (skipColumn)
{
skippedColumnOrdinals.Add(index);
continue;
}
DataColumn datecolumn = new DataColumn(column) { AllowDBNull = true };
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields()
.Where((field, index) => !skippedColumnOrdinals.Contains(index))
.Select(field => field == "" ? null : field)
.ToArray();
csvData.Rows.Add(fieldData);
}
答案 1 :(得分:0)
一种更简单的解决方案是将.csv
文件的全部内容导入数据表,然后从数据表中删除列:
private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
DataTable csvData = new DataTable();
try
{
using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
{
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
string[] colFields = csvReader.ReadFields();
foreach (string column in colFields)
{
DataColumn datecolumn = new DataColumn(column);
datecolumn.AllowDBNull = true;
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields();
//Making empty value as null
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
// get the names of the columns to remove
var columnNamesToRemove = csvData.Columns
.OfType<DataColumn>()
.Where(
c => c.Name.Contains("code") ||
c => c.Name.Contains("Q") ||
c => c.Name.Contains("M")
)
.Select(c => c.Name);
// remove the columns from the data table
foreach(var name in columnNamesToRemove)
{
csvData.Columns.Remove(name);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
return csvData;
}