簡體   English   中英

返回解析器行

[英]Go back in parser rows

我正在嘗試使用 C# 解析 csv 文件(使用 Microsoft.VisualBasic.FileIO 庫)盡管我可以使用此方法解析行字段

fields = parser.ReadFields();

我需要“返回”並使用此方法再次閱讀同一行:

 parser.ReadLine()

有沒有一種方法可以返回並再次讀取同一行而無需再次解析整個文件?

您無法再次讀取該行,因為TextFieldParser使用僅向前流,而ReadLine “將當前行作為字符串返回並將光標前進到下一行 ReadFields

但是將行存儲在變量中很簡單:

string line =  parser.ReadLine();

現在您可以隨時訪問該行而無需再次閱讀。

如果您需要訪問已通過索引讀取的每一行,則必須填寫List<string>

這是僅快速前向解析器的常見問題 - 您無法返回檢查導致解析錯誤的內容。 這就是為什么他們一開始就很快。

如果出現解析錯誤,TextFieldParser 會引發MalformedLineException 您可以捕獲它並檢查 LineNumber 屬性,或檢查解析器的ErrorLineErrorLineNumber屬性。

如果出現語義錯誤,即如果字段沒有意義,則必須使用輸入流本身來查找和加載原始行。

如果使用接受Stream對象的 TextFieldParser 構造函數,則可以在每次調用ReadFields()之前和之后跟蹤流位置。 如果您檢測到語義錯誤,您可以將流的位置更改為ReadFields之前的位置並調用TextFieldParser.ReadLine() ,或者僅使用 StreamReader 從流中讀取一行。 例如:

try
{
    ...
    int pos=myStream.Position;
    var fields=parser.ReadFields();
    if (!fieldsOK(fields))
    {
        myStream.Seek(pos);
        var errorLine=parser.ReadLine();
        //Log it
    }
}
catch(MalformedLineException exc)
{
    var errorLine=parser.ErrorLine;
    //Log it
}

如果您不能使用流,或者流僅向前,則您可能需要在解析之前將 CSV 數據存儲在某處並重新打開它以讀取該行。 例如,如果您的輸入是一個文件路徑,您可以重新加載文件,移動到錯誤行位置並只讀取一行。

如果您預計會有很多語義錯誤,最好將錯誤位置收集在一個列表中,以便您在解析整個文件可以讀取所有相關行。

下面的代碼將在使用 TextFieldParser ReadFields 方法時處理未轉義的引用:

string[] fields;

try {
    fields = parser.ReadFields();
}
catch (MalformedLineException ex) {
    string errorLine = parser.ErrorLine;
    string[] malformedFields = errorLine.Split(',');
    List<string> correctedFields = new List<string>();

    foreach (string field in malformedFields) {
        string correctedField = field.Replace("\"", "");
        correctedFields.Add(correctedField);
    }
    fields = correctedFields.ToArray();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM