CSVReader讀取資料缺失

2021-07-16 18:12:28 字數 1903 閱讀 9455

最近在專案中遇到乙個匯入csv檔案的程式資料缺失嚴重.2.4g的報表600多萬行,匯入資料庫實際只有200多萬行,最後終於找到了問題的所在,並解決了.記錄mark一下

前面的一些曲折過程,懷疑多執行緒來不及處理直接丟棄,就不講了.

程式中用了while ((data = csvreader.readnext()) != null)迴圈進行讀取.

檢視readnext原始碼,也是通過bufferedreader的readline進行一行一行的讀取,只是在字串引用和轉義進行了處理.csv程式預設使用default_separator = 『,』逗號作為一列與一列的分割符,default_quote_character = 『」』雙引號作為字串引用,就是當一列的內容中出現特殊字元如逗號時,怎麼區分這個逗號的是列裡面的內容還是列之間的分割,例如,乙個檔案裡面某列內容為a,b,c為了區分這個a b c之間的逗號為本來的內容,所以用」a,b,c」這樣表示,default_escape_character = 『\』;反斜槓作為轉義.

在字串引用的處理,發現某列資料以雙引號開頭,但是在這一行沒有發現與之對應的雙引號,即是說這一行的雙引號為奇數個,會讀取下一行進行處理,直到找到與之匹配的雙引號.例如,我們的報表在151行在geometry dash後面出現了特殊字元換行符,在xstep後面也出現了換行符

用vim開啟,這一行變成了三行,程式會把這三行當成一行處理,這本身沒有什麼問題.

但是程式中使用反斜槓作為轉義,但是csv檔案中使用雙引號作為轉義,這樣就會造成\」這樣的雙引號不做特殊處理,導致雙引號不匹配,程式繼續讀取下一行,造成資料丟失並且資料混亂.

由於csvreader預設為反斜槓,又不能將轉義設定為雙引號,這樣會和字串引用的雙引號重複,程式處理會混亂,並且程式會丟擲異常the separator, quote, and escape characters must be different!,最後重寫乙個不帶轉義的csvreader構造器,重新打個jar包,最後能夠讀取資料6340034行,解決

附readnext關鍵**:

public string readnext() throws ioexception

string r = parser.parselinemulti(nextline);

if (r.length > 0) else

}} while (parser.ispending());

return result;

}private string parseline(string nextline, boolean multi) throws ioexception

if (nextline == null) ;

} else

}listtokensonthisline = new arraylist();

stringbuilder sb = new stringbuilder(initial_read_size);

boolean inquotes = false;

if (pending != null)

for (int i = 0; i < nextline.length(); i++)

} else if (c == quotechar) else else }}

inquotes = !inquotes;

}infield = !infield;

} else if (c == separator && !inquotes) else }}

// line is done - check status

if (inquotes) else

}if (sb != null)

return tokensonthisline.toarray(new string[tokensonthisline.size()]);

}

Pandas 缺失資料

一.處理缺失資料 二.濾除缺失資料 三.填充缺失資料 方法說明 dropna根據各標籤的值中是否存在缺失資料對軸標籤進行過濾,可通過閾值調節對缺失值的容忍度 fillna用指定值或插值方法 如 ffill 或 bfill 填充缺失資料 isnull返回乙個含有布林值的物件,這些布林值表示哪些值時預設...

Pandas缺失資料

一 缺失值的統計和刪除 缺失資訊的統計 資料處理中經常需要根據缺失值的大小 比例或其他特徵來進行行樣本或列特徵的刪除,pandas中提供了dropna函式來進行操作。dropna的主要引數為軸方向axis 預設為0,即刪除行 刪除方式how 刪除的非缺失值個數閾值thresh 非 缺 失 值 col...

pandas 缺失資料

檢視缺失的比例 全部缺失 df sub set.isna any 1 head 至少有乙個缺失 沒有缺失 資料處理中經常需要根據缺失值的大小 比例或其他特徵來進行行樣本或列特徵的刪除,pandas中提供了dropna函式來進行操作。dropna的主要引數為軸方向axis 預設為0,即刪除行 刪除方式...