[英]TextFieldParser with not parsing last line
我正在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文件中,最后一行用於摘要。 一些字段的總計。
我不想在數據表中插入該行。
我怎樣才能做到這一點 ?
如果內存空間不會成為問題。 首先加載CSV行列表,然后分析每行並保存最后一行。 否則,您需要某種方式來標識摘要行。 (例如,日期等數據為空),這可能表示解析器忽略該行。
處理導入數據的最佳方法是嘗試確定導入文件僅包含要導入的數據。 (沒有標題,沒有摘要等。)不幸的是,許多公司嘗試導入報表而不是實際的導出文件。
如果最后一行以某些特定的字符串(例如“ Summary”)開頭,則可以使用TextFieldParser類的CommentTokens屬性。
請參閱: http : //msdn.microsoft.com/fr-fr/library/microsoft.visualbasic.fileio.textfieldparser.commenttokens(v=vs.110).aspx
和: http : //geekswithblogs.net/brians/archive/2010/07/07/whats-a-nice-class-like-textfieldparser-doing-in-a-namespace.aspx
如果在確定摘要行和內存空間方面有許多不同的情況是問題,則可以始終使用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 鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.