我在sql数据库中导入.csv文件。我正在使用TextFieldParser。
我的代码是
TextFieldParser parser = new TextFieldParser(file);
//single file
//TextFieldParser parser = new TextFieldParser(CSVFolderPath + "\\" + file);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
int k = 0;
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
if (k != 0)
{
for (int i = 0; i < fields.Length; i++)
{
stationcode = fields[0].ToString().Substring(4, 5);
//if (fields[1].ToString().Substring(14, 8) == date)
//{
if (i == 0)
{
dr = workTable.NewRow();
dr[i] = fields[i].Substring(0, fields[i].Length - 4);
}
else if (i == 3)
{
dr[i] = Convert.ToDateTime(fields[i].ToString());
}
else if (i == 4)
{
dr[i] = Convert.ToDateTime(fields[i].ToString());
}
else if (i == 5)
{
dr[i] = Convert.ToInt32(fields[i].ToString());
}
else
dr[i] = fields[i].ToString();
if (i == 5)
{
workTable.Rows.Add(dr);
}
//}
}
}
k = k + 1;
}
parser.Close();
此处的工作表是DataTable。
代码解析文件很好。
但在我的csv文件中,最后一行用于摘要。一些领域的总数。
我不想在数据表中包含该行。
我该怎么做?
答案 0 :(得分:0)
如果内存空间不是问题。首先加载CSV行列表,然后解析除最后一行之外的每一行。否则,您需要一些方法来识别摘要行。 (例如日期之类的空数据)可以通知解析器忽略该行。
处理导入数据的最佳方法是尝试确定导入文件仅包含要导入的数据。 (没有标题,没有摘要等)不幸的是,许多公司尝试导入报告而不是实际的导出文件。
答案 1 :(得分:0)
如果您的最后一行以某个特定字符串开头(“Summary”,对于示例),您可以使用TextFieldParser类的CommentTokens属性。
答案 2 :(得分:0)
如果您需要多种不同的情况来标识摘要行并且内存空间是一个问题,则可以始终使用TextFieldParser.PeekChars(Int32)
方法:
在不前进光标的情况下读取指定数量的字符。
在备注部分:
numberOfChars值必须小于该行中的字符总数。如果不是,则PeekChars返回的字符串将被截断为该行的长度。
为此:
TextFieldParser parser = new TextFieldParser(file);
//single file
//TextFieldParser parser = new TextFieldParser(CSVFolderPath + "\\" + file);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
int k = 0;
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
//Peek if this is the last line, then break
if (parser.PeekChars(Int32.MaxValue) is "") break;
if (k != 0)
{
...
docs.microsoft link