2013-05-28 33 views
0

我們以多種不同格式(CSV,TSV或其他使用更多異國定界符(|,等等)的平面文件)接收文件。這些文件也可以使用文本限定符,也是一系列格式(每個字段都限定,只限於那些包含限定符限定符,不同字符的','等)如何在平面文件(CSV,TSV等)中發現文本限定符?

我寫了一個工具,能夠成功識別文件中的分隔符使用的頻率分析技術與此處提到的Python嗅探器類沒有什麼不同:How should I detect which delimiter is used in a text file?

我現在試圖擴展該工具來支持文本限定文件,這裏的難點在於頻率分析不足以識別文本限定符,因爲許多形式的CSV只會將包含帶有文本限定符的分隔符的字段包裝起來,因此例如,具有10k行的文件在整個文件中可能只有2次出現的文本限定符

我目前的做法是掃描文件尋找分隔符文本限定符對(例如, ,'和',),然後將它們與其他潛在配對(例如「和」)進行比較,並選擇最常發生的配對。

任何人都可以提供更強大的替代?這個問題的一個關鍵約束是我必須支持可以創建的許多不同風格的CSV中的任何一種文件。我的目標是在沒有用戶干預的情況下支持儘可能多的情況。

回答

1

你可以嘗試一些與正則表達式匹配的模式。既然你已經知道分隔符,你可以嘗試一個常見的限定符列表,如"'。如果這些失敗,您可以嘗試解析具有與模式匹配的輸入的不正確列對齊的行,並生成預期的列對齊。

var delimiter = ","; 
var qualifiers = new[] { "\"", "'" }; 
var input = @"""Hello, World"", Hello, World"; 
var pattern = @"(?<={1}).*{0}.*(?={1})"; 

foreach(var p in qualifiers.Select(q => string.Format(pattern, delimiter, q))) 
{ 
    Regex.Match(input, p); 
} 
+0

謝謝,我會進一步研究。我認爲正則表達式可能是一條可行的路線,但由於有幾種情況需要考慮,所以正在努力思考正確的表達方式 - 如果第一個字段是文本限定的,那麼它就是「...」,例如,而不是, 「...」,這是翻轉的文本合格的最後一場。你的答案可能只是我需要的跳板。 –

0

你可以使用正則表達式提取特殊字符的索引嗎?在索引上你可以得到序列。

相關問題