簡體   English   中英

正則表達式刪除csv文件中的錯誤字符以使SplFileObject在PHP中正常工作

[英]Regex to delete faulty characters within a csv file to make SplFileObject work correctly in PHP

我嘗試通過SplFileObject在PHP中解析一個csv文件。 遺憾的是,如果文本中有錯誤的不可見字符,SplFileObject有時會SplFileObject 該函數在循環瀏覽csv文件中的行時檢測引號而不是跳過引號或將其作為常規字符讀取。 下面的屏幕截圖來自Textwrangler:

在此處輸入圖片說明

我也在這里從Textwrangler復制了它(不可見的char應該在“forgé。”和“ Circa”之間):

Fer forgé.� Circa

我的代碼(SplFileObject部分):

$splFile = new \SplFileObject($file);
$splFile->setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV);
$splFile->setCsvControl(",", '"', '"');

我試圖通過file -I my.csv csv文件具有哪個字符集。 輸出: my.csv: application/octet-stream; charset=binary my.csv: application/octet-stream; charset=binary 這是一個奇怪的結果,因為該文件可通過Textwrangler讀取,因此不是二進制文件。 我還讀取了以相同方式生成的另一個csv,並且輸出與預期的一樣: second.csv: text/plain; charset=utf-8 second.csv: text/plain; charset=utf-8 用於生成csv文件的工具稱為Visual Web Ripper (用於爬網網頁的工具)。

我如何確定此上下顛倒的問號是哪個字符(似乎不是西班牙上下顛倒的問號-也許只是Textwrangler插入的占位符)? 如何刪除csv文件中的此字符和所有“無效”字符? 是否有一個正則表達式匹配每個字符,數字,符號(標點符號和其他文本符號),而這實際上是一個真實字符,而忽略了上面示例中的內容? 我正在尋找一個unicode安全的正則表達式(也需要保留德國變音符號,法語,俄語,中文,日本和韓國字符)。 或者:如何將具有charset=binary的csv文件轉換為UTF-8

編輯:如果我通過nano編輯器打開它,則會顯示forgé.^@ Circa 快速搜索后,它似乎是一個NUL字符或\\ u0000(請參閱注釋和https://en.wikipedia.org/wiki/Null_character以供參考)。

編輯2:我對其進行了更深入的研究: $splFile->current()函數似乎有問題,該函數在當前文件指針處讀取一行。 該行在NUL字符之后被截斷(無論我是嘗試通過SplFileObject::READ_CSV還是與普通字符串一樣讀取(不帶SplFileObject::READ_CSV參數))。

解決方案是忽略SplFileObject::DROP_NEW_LINE參數。 我也查了,如果NUL字符存在:它是存在的,但它現在被認為是在CSV具體列的文本價值的一部分,並沒有被檢測為報價或柱外殼。

當然,您現在必須自己用fe過濾掉空行,例如:

$splFileObject = new \SplFileObject();
$splFileObject->setFlags(\SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV);

$columns = $splFileObject->current();
if (count($columns) === 1 && array_key_exists(0, $columns) && $columns[0] === NULL) {
   // empty csv line
}

暫無
暫無

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

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