亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Java實現(xiàn)Excel/CSV數(shù)據(jù)鍵值比對與差異核對實戰(zhàn)

Java實現(xiàn)Excel/CSV數(shù)據(jù)鍵值比對與差異核對實戰(zhàn) 簡介在日常Java開發(fā)中經(jīng)常需要比對兩份表格類數(shù)據(jù)文件可能是Excel工作簿也可能是CSV文本。核心思路通常是指定若干關(guān)鍵列作為鍵值來進行行匹配先找到兩個文件中的對應(yīng)行再比較指定列的值是否變化從而發(fā)現(xiàn)修改、新增或缺失的數(shù)據(jù)。這份資源正是圍繞該需求整理的示例代碼完整演示了如何使用Apache POI讀取Excel、OpenCSV解析CSV、以鍵值組合構(gòu)造哈希表存儲行數(shù)據(jù)以及在遍歷過程中輸出各類差異信息的處理過程思路清晰適合有基礎(chǔ)Java語法、需要批量核對表格數(shù)據(jù)的開發(fā)者參考。壓縮包共24個文件包含9個Java源碼、9個編譯后的class文件、3個依賴jar包及工程配置文件整體僅666KB下載后可直接導(dǎo)入IDE查看或按需修改。已有2541人學(xué)習(xí)下載。資源小巧但結(jié)構(gòu)完整既提供了演示主類調(diào)用骨架也附帶了lib目錄下的依賴庫省去手動查找外部包的麻煩對于學(xué)習(xí)POI/OpenCSV基礎(chǔ)用法或?qū)崿F(xiàn)輕量級表格比對工具都具有不錯的實用價值。1. 鍵值比對讓兩張表的差異核對從人工變成代碼現(xiàn)實中經(jīng)常遇到這類場景某個系統(tǒng)導(dǎo)出一份 Excel 報價單另一個系統(tǒng)導(dǎo)出一份 CSV 清單業(yè)務(wù)要核對同一批數(shù)據(jù)在兩邊有哪些值不一樣或者上個月的全量數(shù)據(jù)文件跟這個月的做差異檢查。逐行翻表是純體力活行一多就眼花行順序稍微變一變就很容易看錯。這個標題要解決的就是把某幾列拼成唯一鍵把兩邊的行按鍵對齊再只對指定列做值比較輸出哪些行是新增、哪些是刪除、哪些值有變化。適合天天和數(shù)據(jù)文件打交道的開發(fā)、運維和數(shù)據(jù)專員核心收益是讓核對變成一條命令能跑完的事。2. 先定鍵再選結(jié)構(gòu)比對方案的四項設(shè)計決策2.1 為什么選鍵值而不是逐行比對先說透一個道理兩張表行順序一致的情況在真實業(yè)務(wù)里非常少見。某個系統(tǒng)導(dǎo)出的清單行序可能按創(chuàng)建時間排另一邊導(dǎo)出可能按部門分組如果中間還經(jīng)過一次 Excel 手工調(diào)整行序就更不可信了。逐行比對在這種場景下完全不靠譜第一行和第一行根本不是同一個業(yè)務(wù)對象。所以必須找一個不依賴行序的對齊方式這就是鍵值比對的核心動機把業(yè)務(wù)上的唯一標識當成行的地址再按地址把兩邊的行拉齊。這個思路跟數(shù)據(jù)庫里的 FULL OUTER JOIN 幾乎一模一樣表 A 按主鍵、表 B 按主鍵一次關(guān)聯(lián)就能區(qū)分出三種情況只在 A 里、只在 B 里、兩邊都有但某些字段不一致。只不過這里我們不想為一次性檢查建兩張表直接在內(nèi)存里用 Map 手工實現(xiàn)。選鍵有三條原則建議寫代碼前先確認。第一是唯一性鍵如果在表里重復(fù)后讀進來的行會覆蓋先讀進來的行部分數(shù)據(jù)被靜默丟棄。第二是穩(wěn)定性兩邊的拼接規(guī)則必須完全一致比如鍵是單號加行號那就兩邊都拼這兩列不能一邊拼三列一邊拼兩列。第三是注意空值鍵列里某格為空時拼接出來的鍵可能變成空字符串多個空行會撞到同一個鍵上。這三條如果業(yè)務(wù)上滿足不了正確做法不是硬寫代碼而是先去跟上游確認數(shù)據(jù)含義。鍵值比對該不該做、能不能做答案往往不在代碼里而在對業(yè)務(wù)主鍵的理解有多深。我在模擬項目X里接過一個需求兩側(cè)導(dǎo)出的訂單編號一邊有前綴一遍沒前綴花了半小時想清楚鍵的歸一化問題比直接開寫快得多。2.2 數(shù)據(jù)結(jié)構(gòu)選型String數(shù)組還是列名Map讀進來的每一行怎么存我一般看列數(shù)多少、列順序是否固定來決定。最穩(wěn)妥的起步方案是String[]存單元格值外加一個ListString存表頭。列順序兩邊一致時直接按下標取單元格讀寫都最直觀讀取器不需要引入復(fù)雜模型比對器只需要把列下標傳來傳去。缺點是列一多下標含義要靠表頭來回查代碼可讀性下降。另一種方案是每行存成MapString, String列名做 key。優(yōu)點是列順序不一致甚至列數(shù)不同都不怕比對的列名直接當作鍵來取缺點是每個單元格都要構(gòu)造一個 Map.Entry內(nèi)存開銷比數(shù)組大不少幾萬行時尚可接受幾十萬行就明顯肉疼。我在一次數(shù)據(jù)核對中對比過兩種寫法同等數(shù)據(jù)量下后者的內(nèi)存占用大概是前者的三倍。判斷項String[] List表頭MapString, String內(nèi)存占用低高約 3 倍列順序不一致需要列名轉(zhuǎn)下標天然支持讀取代碼量少稍多比對代碼按下標直觀按列名語義清晰適用行數(shù)五萬行以上更友好幾萬行內(nèi)很舒服我的個人傾向是列數(shù)在 20 列以內(nèi)、兩邊列順序一致直接用數(shù)組列順序亂、列數(shù)十個以上寧可用 Map。如果你只打算寫一個一次性的核對腳本數(shù)組方案夠用且快改動成本也最低。2.3 鍵值拼接策略分隔符、空值和重復(fù)鍵鍵值的生成是整個程序的地基地基錯了后面全盤錯。單列鍵簡單直接取該列單元格值多列鍵就需要一個拼接方法。常見做法是用分隔符把多列值串起來例如orderNo | lineNo。這個分隔符有個隱蔽的坑如果業(yè)務(wù)數(shù)據(jù)本身含有這個字符兩個不同組合可能拼出同一個鍵。比如訂單號AB|C和行號1拼出來是AB|C|1訂單號AB和行號C|1拼出來也是AB|C|1。規(guī)避辦法有兩種一是選一個數(shù)據(jù)里幾乎不可能出現(xiàn)的字符比如\u0001二是拼完后再加一個長度前綴比如3:AB|1:C|1這種寫法能徹底杜絕碰撞。還有人圖省事用Objects.hash(code, lineNo)生成整數(shù)鍵內(nèi)存省一點運行也快。但哈希碰撞雖然概率低撞上一次足夠你懷疑人生。我的建議是能用字符串拼鍵就別用哈希除非你明確知道兩個鍵列允許存在重復(fù)且想用哈希把重復(fù)行聚到一起做統(tǒng)計那就另說。2.4 保持輸出順序穩(wěn)定的理由構(gòu)建映射表時用HashMap還是LinkedHashMap會影響差異報告里的行順序。HashMap的遍歷順序由哈希桶決定看著像隨機順序LinkedHashMap按插入順序遍歷先讀到的行先出現(xiàn)在報告里。這個細節(jié)平時不起眼真到了排查的時候差別很大。差異報告輸出順序如果和主文件行順序一一對應(yīng)你就能順著原始行一路查下來如果是亂序查一行要找半天。所以我在所有構(gòu)建映射的地方統(tǒng)一用LinkedHashMap代價幾乎為零收益是報告可直接和原文件對照。還有一個容易被忽略的決策主文件選哪一邊。我的做法是把增量基準作為主表也就是舊表新表里多出來的行算新增舊表里消失的行算刪除。如果業(yè)務(wù)定義反過來只需要在調(diào)用時調(diào)換兩個參數(shù)輸出報告里新增刪除的語義就互換了程序內(nèi)部不必為這個邏輯做分支。提示如果你用 Java 9 以上的Map.of()構(gòu)造小常量集合要注意它們是不可變且不允許 null 鍵值。在鍵值拼接的單元測試里這個點很容易被忽略。3. 最小可運行實現(xiàn)讀取、對齊、比對三步走3.1 統(tǒng)一讀取入口CSV 和 Excel 各寫一個方法先明確一個前提我不會用同一個庫去解析 CSV 和 Excel它們的格式完全不同。常見做法是各寫一個讀取方法返回統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)MapString, String[]調(diào)用方只關(guān)心我拿到了鍵值到整行單元格的映射不關(guān)心背后是哪種文件。CSV 我一般直接手寫解析比引入 OpenCSV 更輕也更容易控制細節(jié)。讀取時有三個注意點一是編碼必須在打開流時指定二是每行調(diào)用split(,, -1)必須帶第二個參數(shù) -1三是表頭行要單獨跳過。第三個問題雖然看起來簡單但表頭行也可能是空行只判斷行號 0 就會漏掉真正的內(nèi)容行。public MapString, String[] readCsv(Path file, Charset charset, ListInteger keyCols) throws IOException { MapString, String[] data new LinkedHashMap(); try (BufferedReader reader Files.newBufferedReader(file, charset)) { String line; boolean hasHeader false; while ((line reader.readLine()) ! null) { if (line.isBlank()) { continue; } if (!hasHeader) { hasHeader true; continue; } String[] cells line.split(,, -1); data.put(buildKey(cells, keyCols), cells); } } return data; }這段代碼里hasHeader用布爾值跳過第一行空行直接跳過split(,, -1)保留末尾空字段LinkedHashMap保證輸出順序。如果遇到中文亂碼把charset換成Charset.forName(GBK)大多能解決不過編碼問題不是這一句就能完全說清的后面避坑章會專門展開。Excel 的讀取我使用 Apache POI 的WorkbookFactory.create方法它自動識別xls和xlsx省去自己判斷擴展名。POI 讀取有幾個特點空單元格row.getCell(i)返回 null數(shù)字單元格默認按 double 返回日期單元格在 POI 底層也是數(shù)字。所以讀取時必須做單元格類型轉(zhuǎn)換不能直接toString。public MapString, String[] readExcel(Path file, ListInteger keyCols) throws IOException { MapString, String[] data new LinkedHashMap(); try (Workbook workbook WorkbookFactory.create(file.toFile())) { Sheet sheet workbook.getSheetAt(0); boolean hasHeader false; for (Row row : sheet) { if (!hasHeader) { hasHeader true; continue; } int lastCell row.getLastCellNum(); String[] cells new String[lastCell]; for (int i 0; i lastCell; i) { cells[i] getCellValueAsString(row.getCell(i)); } data.put(buildKey(cells, keyCols), cells); } } return data; }需要留意row.getLastCellNum()它返回的是最后一個有內(nèi)容的列序號加一不是列數(shù)。某些行如果右半邊完全為空這個值比表頭列數(shù)小得到的String[]長度就不齊后面按下標比對會數(shù)組越界。我的處理是在讀取表頭后先記錄表頭列數(shù)所有數(shù)據(jù)行統(tǒng)一按表頭列數(shù)創(chuàng)建數(shù)組長度永遠一致。上面這段代碼為了保持簡短沒有寫出這個細節(jié)實際使用記得改掉。3.2 單元格值轉(zhuǎn)字符串數(shù)字、日期與空值的統(tǒng)一口徑POI 的Cell.getCellType()返回值類型有字符串、數(shù)字、布爾、公式、空等多種一一轉(zhuǎn)成字符串并不復(fù)雜麻煩的是格式細節(jié)。下面這個方法就是統(tǒng)一口徑的關(guān)鍵private static String getCellValueAsString(Cell cell) { if (cell null) { return ; } switch (cell.getCellType()) { case STRING: return cell.getStringCellValue().trim(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { return new SimpleDateFormat(yyyy-MM-dd).format(cell.getDateCellValue()); } double num cell.getNumericCellValue(); if (num Math.floor(num) !Double.isInfinite(num)) { return String.valueOf((long) num); } return String.valueOf(num); case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: CellType cachedType cell.getCachedFormulaResultType(); if (cachedType CellType.NUMERIC) { return String.valueOf(cell.getNumericCellValue()); } if (cachedType CellType.STRING) { return cell.getStringCellValue(); } return ; default: return ; } }這個方法解決了兩個經(jīng)典翻車現(xiàn)場一是數(shù)值單元格存的是 100POI 卻返回 100.0直接轉(zhuǎn)字符串會讓兩邊對不上二是日期單元格不處理就是一串 45000 左右的浮點數(shù)。DateUtil.isCellDateFormatted判斷日期格式后再格式化比對的日期值就統(tǒng)一了。注意格式化粒度是天級別如果兩邊都是帶時間戳的單元格只差幾分鐘都會判為不同此時請把yyyy-MM-dd換成yyyy-MM-dd HH:mm:ss。公式分支我直接讀取緩存結(jié)果類型避免拿到VLOOKUP(...)這種公式文本和另一邊的300去比對。POI 解析文件時默認會緩存公式結(jié)果但這里要注意如果文件里的公式依賴外部工作簿或 POI 無法計算緩存結(jié)果可能拿不到走到默認分支返回空串比對的準確性就會下降。對一次性核對來說遇到這類文件建議先在上游把公式轉(zhuǎn)成靜態(tài)值再導(dǎo)出。數(shù)字格式化的口徑也要統(tǒng)一考慮。Excel 單元格顯示為100.00時getNumericCellValue()返回的仍是 double我上面的寫法會把它轉(zhuǎn)成100如果 CSV 那邊存的是100.00兩邊數(shù)值一樣但字符串對不上。此時不要在讀取代碼里到處打補丁而是在normalize方法里集中做數(shù)字格式歸一化比如用BigDecimal比較數(shù)值大小或者統(tǒng)一保留兩位小數(shù)。3.3 比對邏輯新增、刪除、修改三路遍歷讀完文件、構(gòu)建好兩邊映射之后剩下的就是遍歷。我習(xí)慣分成三路先遍歷舊表鍵在新表中不存在就是刪除鍵存在就比較指定列的值有變化就是修改最后遍歷新表鍵在舊表中不存在就是新增。public CompareReport compare(MapString, String[] oldData, MapString, String[] newData, ListInteger valueCols) { CompareReport report new CompareReport(); for (Map.EntryString, String[] entry : oldData.entrySet()) { String key entry.getKey(); String[] oldRow entry.getValue(); String[] newRow newData.get(key); if (newRow null) { report.addDeleted(key, oldRow); continue; } ListString diffs new ArrayList(); for (int col : valueCols) { if (!Objects.equals(normalize(oldRow[col]), normalize(newRow[col]))) { diffs.add(col : normalize(oldRow[col]) - normalize(newRow[col])); } } if (!diffs.isEmpty()) { report.addModified(key, oldRow, newRow, diffs); } } for (Map.EntryString, String[] entry : newData.entrySet()) { if (!oldData.containsKey(entry.getKey())) { report.addAdded(entry.getKey(), entry.getValue()); } } return report; } private static String normalize(String value) { if (value null) { return ; } return value.trim(); }兩個參數(shù)值得在調(diào)用前想清楚valueCols是要比對的列下標列表比如[3, 4, 5]如果希望所有非鍵列都比可以在 main 方法里從表頭長度生成一個連續(xù)下標列表。normalize這里只做了空轉(zhuǎn)空串和去首尾空格實際業(yè)務(wù)里可能還要處理全角空格、大小寫、數(shù)字格式化這些都要依據(jù)業(yè)務(wù)自己在 normalize 里補。正常化這一步直接影響差異數(shù)量的真實性多花五分鐘調(diào)它比調(diào)任何其他環(huán)節(jié)都值。4. 輸出差異報告讓結(jié)果直接可讀4.1 差異數(shù)據(jù)模型新增、刪除、修改三類存儲比對完的結(jié)果不能只放一個總共有多少不同的計數(shù)后續(xù)要么打印到控制臺、要么寫文件、要么接自動化測試斷言所以先定義一個可復(fù)用的模型。public class CompareReport { private final ListRowDiff added new ArrayList(); private final ListRowDiff deleted new ArrayList(); private final ListRowDiff modified new ArrayList(); public static class RowDiff { final String key; final String[] oldRow; final String[] newRow; final ListString fieldsChanged; RowDiff(String key, String[] oldRow, String[] newRow, ListString fieldsChanged) { this.key key; this.oldRow oldRow; this.newRow newRow; this.fieldsChanged fieldsChanged; } } public void addAdded(String key, String[] row) { added.add(new RowDiff(key, null, row, List.of())); } public void addDeleted(String key, String[] row) { deleted.add(new RowDiff(key, row, null, List.of())); } public void addModified(String key, String[] oldRow, String[] newRow, ListString fieldsChanged) { modified.add(new RowDiff(key, oldRow, newRow, fieldsChanged)); } public boolean hasDiff() { return !added.isEmpty() || !deleted.isEmpty() || !modified.isEmpty(); } // getter 按需補齊 }設(shè)計上有個細節(jié)容易被忽略fieldsChanged存的是列下標加舊值加新值的字符串但oldRow和newRow也會完整保留。這樣做是為了輸出時可以整行打印也可以只打印變化字段兩種格式都覆蓋到。如果你只把變化字段拼成一句描述后面想換個輸出格式又得重新比對一遍等于寫死了一條路。模型類還應(yīng)該提供一個hasDiff()方法讓調(diào)用方一行判斷有沒有差異省得每次檢查三個列表是否為空。這個判斷在自動化測試里反復(fù)用到比如 CI 里跑完比對后直接斷言report.hasDiff() false干凈利落。提示List.of()返回的是不可變列表后續(xù)如果要在fieldsChanged上做動態(tài)過濾建議在構(gòu)造函數(shù)里復(fù)制成new ArrayList(fieldsChanged)避免不可變集合上拋異常。4.2 控制臺輸出與文件輸出雙通道輸出通道我分兩種差異量小走控制臺差異量大走文件??刂婆_輸出的目標是掃一眼知道問題多大所以先打一個匯總統(tǒng)計再逐條打印明細。修改類應(yīng)該單獨把鍵、舊值、新值按塊打印方便肉眼對比新增和刪除直接整行打出來就行。public void printToConsole(CompareReport report, ListString headers) { System.out.printf(新增 %d 行刪除 %d 行修改 %d 行%n, report.getAdded().size(), report.getDeleted().size(), report.getModified().size()); for (CompareReport.RowDiff diff : report.getDeleted()) { System.out.println([刪除] 鍵 diff.key 數(shù)據(jù) Arrays.toString(diff.oldRow)); } for (CompareReport.RowDiff diff : report.getAdded()) { System.out.println([新增] 鍵 diff.key 數(shù)據(jù) Arrays.toString(diff.newRow)); } for (CompareReport.RowDiff diff : report.getModified()) { System.out.println([修改] 鍵 diff.key); for (String field : diff.fieldsChanged) { System.out.println( resolveColName(headers, field)); } } }當差異量到幾千行時控制臺滾動就不太適合了這時另一條通道是落 CSV 文件。落文件時把修改行展開成一行一條鍵、狀態(tài)、列名、舊值、新值。寫文件時記得每條記錄結(jié)束后寫\r\n而不是\n否則用 Windows 版 Excel 打開會看到所有內(nèi)容擠在同一行。public void writeToCsv(CompareReport report, ListString headers, Path output) throws IOException { try (BufferedWriter writer Files.newBufferedWriter(output, StandardCharsets.UTF_8)) { writer.write(鍵,狀態(tài),列名,舊值,新值\r\n); for (CompareReport.RowDiff diff : report.getAdded()) { writer.write(escapeCsv(diff.key) ,新增,,,\r\n); } for (CompareReport.RowDiff diff : report.getDeleted()) { writer.write(escapeCsv(diff.key) ,刪除,,,\r\n); } for (CompareReport.RowDiff diff : report.getModified()) { for (String field : diff.fieldsChanged) { String[] parts splitField(field); writer.write(escapeCsv(diff.key) ,修改, escapeCsv(parts[0]) , escapeCsv(parts[1]) , escapeCsv(parts[2]) \r\n); } } } }這里splitField需要從3:100 - 200這樣的文本里拆出列名、舊值、新值配合escapeCsv對值里的逗號和雙引號做轉(zhuǎn)義雙引號變成兩個雙引號整體再用雙引號包起來這是最簡且通用的 CSV 轉(zhuǎn)義規(guī)則。不加轉(zhuǎn)義的話地址、備注這類字段里一個逗號就能把整列撐錯位。什么時候走文件輸出我會在 main 方法里加一個--output參數(shù)傳了它就寫文件不傳就打印控制臺。這樣同一個 jar 包既能用于人工核對也能在定時任務(wù)里把報告落盤。這個參數(shù)設(shè)計改動不大但讓工具的使用場景寬了一倍。4.3 把列下標翻譯成列名報告才給業(yè)務(wù)看得懂到現(xiàn)在為止代碼里一直用列3列4表示變化字段開發(fā)時沒問題把報告交給業(yè)務(wù)看就說不過去了。翻譯很簡單讀文件時把表頭保存到ListString打印時按下標查表頭。private static String resolveColName(ListString headers, String diffText) { int colon diffText.indexOf(:); if (colon 0) { return diffText; } int colIndex Integer.parseInt(diffText.substring(0, colon)); String colName (colIndex 0 colIndex headers.size()) ? headers.get(colIndex) : 列 colIndex; return colName diffText.substring(colon); }這個函數(shù)依賴fieldsChanged里的字符串格式固定因此構(gòu)造這個列表時一定要統(tǒng)一格式比如3:100 - 200這種帶冒號和箭頭的約定不要混入兩種格式否則解析時會出現(xiàn)各種怪異情況。如果你覺得字符串解析太脆弱更穩(wěn)妥的做法是在RowDiff里存ListInteger changedCols輸出時再按需查表頭轉(zhuǎn)列名適合長期維護的產(chǎn)品代碼resolveColName這個輕量方案適合一次性核對工具。5. 避坑指南鍵值比對最常見的五個翻車點5.1 空值和空字符串被誤判成修改現(xiàn)象兩邊文件同一位置一個單元格沒填、一個填了空字符串比對結(jié)果顯示一大票空 - 空的修改看得人心煩。原因讀取 Excel 時空單元格getCellValueAsString返回的是 null 或空串而 CSV 空字段解析出來是空串兩邊只要有一邊取到的形態(tài)不同Objects.equals就直接判不等。解決比對前統(tǒng)一做一次 normalize讓 null 和空串變成同一個值。如果兩邊都做了這一步還在報差異就要檢查是不是一邊有普通空格一邊有全角空格String.trim()也要進 normalize??罩嫡Z義還是要由業(yè)務(wù)確認比如單價為空和單價為 0是否一致不要程序自己拍板。5.2 數(shù)字單元格變身科學(xué)計數(shù)法現(xiàn)象Excel 里一個大整數(shù)比對報告顯示1.2345678901E10CSV 那邊卻是普通寫法12345678901兩邊對不上。原因POI 的數(shù)字單元格按 double 讀入超過一定位數(shù)時 Java 默認用科學(xué)計數(shù)法轉(zhuǎn)字符串CSV 讀進來的是原始字符串自然長不一樣。解決數(shù)字格式化工具方法里多加一道判斷整數(shù)部分直接轉(zhuǎn) long 去掉小數(shù)尾巴。超過 15 位的超長數(shù)字比如業(yè)務(wù)單號被 Excel 存成數(shù)字double 本身就有精度損失這個只能從源頭解決讓上游把該列存成文本。排錯時可以用BigDecimal.valueOf(num).toPlainString()做臨時查看不要直接信Double.toString的顯示。5.3 CSV 中文亂碼編碼問題比想象中更常見現(xiàn)象比對結(jié)果里中文變成一串亂碼或問號數(shù)字和字母正常。原因CSV 文件本身的編碼和讀取時指定的Charset不一致。Windows 上用 Excel 另存的 CSV 多半是 GBK從服務(wù)端導(dǎo)出的通常是 UTF-8兩個交叉就容易亂。解決在 main 方法里暴露--charset參數(shù)并傳給Charset.forName默認寫成 UTF-8。遇到亂碼先別猜用十六進制方式看文件開頭的幾個字節(jié)有EF BB BF是帶 BOM 的 UTF-8沒有就是 GBK 或者無 BOM UTF-8。如果同事用 Excel 打開正常但程序讀亂碼大概率文件是 GBK傳--charset GBK即可。這個坑很小但在真實環(huán)境里出現(xiàn)頻率極高尤其當文件經(jīng)手多個人時。5.4 鍵值重復(fù)導(dǎo)致行被靜默覆蓋現(xiàn)象比對結(jié)果顯示大量新增和刪除修改數(shù)為 0而且新增刪除行數(shù)接近看起來像整表重發(fā)。原因鍵值列不唯一Map.put時新行覆蓋舊行兩邊的重復(fù)行各自只保留下最后一條于是舊表有 A 鍵、新表有 A 鍵但指向不同的行就變成了刪一行增一行的假象。解決讀取時統(tǒng)計每個鍵的出現(xiàn)次數(shù)超過一次就向標準錯誤打警告。加一行重復(fù)檢查代碼成本很低但能救回很多排查時間public void putWithDuplicateCheck(MapString, String[] data, String key, String[] row) { String[] existed data.put(key, row); if (existed ! null) { System.err.println(警告: 鍵值重復(fù), key 被覆蓋); } }如果業(yè)務(wù)上鍵必須唯一說明數(shù)據(jù)本身已經(jīng)臟了要先清洗再比對如果鍵只是主鍵的一部分需要重新確認鍵列組合。無論如何都不要在看不警告的情況下直接信任比對結(jié)果。5.5 行尾逗號被吞整列數(shù)據(jù)悄悄錯位現(xiàn)象CSV 中某一行末尾有空列讀進來看不見報錯但比對時那一列的值和其他行對不齊單獨看每行又好像沒問題。原因line.split(,)不加第二個參數(shù)會丟棄末尾空字符串。例如一行是A,B,split 得到 2 個元素而不是 3 個后續(xù)按下標比對時少一列整行的末位列都會錯位。解決堅持用split(,, -1)保留空尾部。這個符號看著不起眼但它是 CSV 解析里最陰的坑之一錯過一次印象就深了。另外如果 CSV 字段本身帶引號包裹的逗號手寫split就不夠用了需要引入一個支持轉(zhuǎn)義的狀態(tài)機解析器或者直接用現(xiàn)成的 CSV 解析庫不要硬手擼。如果你手頭的場景跟上面五條都無關(guān)但還是翻車優(yōu)先懷疑數(shù)據(jù)本身先寫個最小復(fù)現(xiàn)用例用五六行假數(shù)據(jù)跑一遍比對確認程序邏輯沒問題再去處理真實文件。把問題定位到數(shù)據(jù)還是代碼這一步是排查所有 Excel/CSV 類工具的關(guān)鍵。6. 進階超過十萬行時怎么不把內(nèi)存打爆內(nèi)存 Map 方案在行數(shù)超過十幾萬時會明顯吃力。兩個MapString, String[]加上 POI 讀 Excel 時的對象開銷堆內(nèi)存占用很容易突破 1GB。如果只是臨時核對調(diào)大-Xmx是最快的路但要做成定時任務(wù)就得換思路。一個常用做法是流式讀取按鍵排序后落臨時文件再用雙指針歸并比較。流程是讀左邊每一行拼鍵按鍵排序?qū)懭肱R時文件右邊同樣處理然后兩個有序文件各取一個游標鍵相等就比對指定列鍵不等時小的那個鍵所在的行就是只在一邊存在的差異。排序可以用 JDK 自帶的Files.lines()配合外部歸并排序?qū)崿F(xiàn)量會大一些但內(nèi)存占用可以控制在幾十 MB 以內(nèi)。還有一個中間量級非常好用的方案把兩個文件分別導(dǎo)入嵌入式數(shù)據(jù)庫表然后用一條 SQL 做 FULL OUTER JOIN比手寫 Java 穩(wěn)妥得多。Java 程序里只需要負責(zé)參數(shù)解析和把最終差異格式化輸出核心比對交給引擎SELECT a.key, a.val_old, b.val_new FROM old_file a FULL OUTER JOIN new_file b ON a.key b.key WHERE a.val_old IS DISTINCT FROM b.val_new到這一步鍵值比對的工具就從一次性腳本長成了能扛住生產(chǎn)數(shù)據(jù)量的核對程序。我的個人習(xí)慣是文件超過十萬行先問自己一句——真的要在 Java 里用 Map 硬扛嗎多數(shù)時候答案是不必。把讀取和比對下推給引擎程序里的邏輯少一半內(nèi)存問題也自然消失。希望這套做大文件的關(guān)鍵做法能幫到你。下次拿到兩張要對齊的表可以先花十分鐘想清楚鍵值、空值和數(shù)據(jù)量再動手寫代碼能少走很多彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
大香蕉丝袜一级片| 强奸乱伦资源| 人人妻人人爽一区二区三区| 激情五月天丁香| 日夜尻逼网| 日本 色 导航| 亚洲精品1区| 操操逼视频| 96免费视频在线| 欧美成熟性爱精品| 日韩中文字幕精品一区在线| 日韩精品第3页| 日本欧美一区二区三区视频麻豆| 超碰97亚洲区| 五月丁香| 丁香五六月啪啪| 中出91视频| 六月丁香久久| 国产成人亚洲精品无| 亚州情色j区| 国产一区二区三区高清视频| 99色热| 婷婷五月天av| 欧美v亚洲v综合v国产v妖精| 天天综合官网| 亚洲综合性网址| 日日碰狠狠添天天爽超| 久夜视频| 久久一二三四五六七八九区区| 欧美人妻久久精品二区三区| 色约约一区=区三区| 久久超碰久| 亚洲 欧美 手机在线观看| 色官网色综合| 精品久| 伊人精品视频| 日产成人久久| 嗯嗯啊啊亚欧精品| 久久久成人国产精品无码| 爱啪精品一区| 性性欧美| 国产精品不卡少妇白| 超硑97精品| 操逼网免费无码视频| av无线看| 在线播放成人网站| 中国国产精品一区视频| 免费?级毛片无码?∨蜜芽试看| 97色97干| 青青草好吊色| 亚洲九九视频| 亚洲欧洲激情卡通另类文学四射小说网站| 国产欧美另类久久久精品课程| 国产精品一区二区三区免费视频| 污色区网站| 91色人| 97人人爱人人做人人乐| 国产熟女精品区| 在线亚洲丝袜视频网站| 久久蜜色情在线视频xxx免费观看| 国产久久视频| 人妻天天爽夜夜爽爽| 可能人人看人人摸| 国产精品一区二区三区,亚洲综合| 中文字幕交换人妻| 中国东北熟女老太婆内谢| 亚洲高清综合网| 亚洲一区二区av| 亚洲人成网站7777| av在线一区二区三区| 男女激情黄色网址| 欧美中文字幕男人天堂久久精品| 水野优香在线观看| 99激情视频| 日本 欧美 亚中文字幕| wwe 天天干.com| Aa东京男人的天堂| 91美女视频在线观看| 狠狠操,使劲操| 丁香九月婷婷| 天天摸夜夜添无码小视频| 亚洲精品性爱片| 天天干天天操天天干天天操| 偷看洗澡一二三区美女| 色诱中文字幕| 四虎在线观看网站| 亚洲欧美日韩制服另类| 日韩美女操b| 精品视频在线观看精品| 国产在线观看一区二区三区| 中文字幕精品日韩中文字幕| 操人妻少妇中文| 精品久久久不卡一区二区| 四虎精品永久在线观看| 大香蕉一区二区在线观看.| 91九色在线| 久久久性爱视频| 78m啪啪啪| 午夜男女爽爽爽影院视频| 久久精品色欧美aⅴ一区二区| 欧美久久婷| 色综合加勒比四四季| 91精品国产长腿丝袜美女| 超碰欧美COM| 亚洲黄色a级片| 久久爱超碰网| 欧美亚洲首页| 在线啊v一区| 99精品网站| 日韩电影天堂视频一区二区| 欧美gv在线观看| 久99热| 人妖欧美一区二区| 免费观看欧美日韩操逼视频 | 久久久久久加勒比| 丝袜视频网国产90| 粉嫩不卡一区二区性爱| 久超碰这里只有精品| 久久久久久亚洲中文| 中文字暮97| 欧美熟妇视频| 欧美瑟综合| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 91动漫操逼视频| 粉嫩小泬久久久一区二区| 欧美一级黄色免费专区| 精品乱码在线观看| 97色香蕉| 五月综合色| 久久久久久人体| 午夜精品久久一区二区| 天天综合色电影| 高清无码 国产精品| 91中文精品日韩欧美在线| 天天夜躁日日躁狠狠2002| 亚洲一本大道中文字幕无码在线| 人人摸人人舔一区二区| 图片区小说区| 青草精品视频日本久久久久网站在线| 久久久一级| 永久免费观看的毛片的网站| 亚洲综合射| 国产精品熟女一区二区三区| 99re这里只有精品3| 欧美自拍偷拍综合图片| 久久欧美按摩999| 久久性爱精品一区| 粉嫩久久久极品| 黄色大片免费在线| 97欧美久久久久久久| A片 AV一级在线播放观看免费 | 日韩在线欧美精品一区二区| 国产成人啪一区二区| 秋霞欧美性爰视频| 国产农村妇女精品| 亚洲综合射| 国产精品熟女乱伦| 99re这里只有精品2| 天天天天干| 欧美99999| 久久日本熟妇熟色高清| 中文字幕成人| 人人操我人人干| 国产2.3.4区| 五月天婷婷欧美三区| 国产无码精品无码| 影音资源男人日韩| 99青草| 搞中出久久| 台湾佬中文娱乐网久久久久久久久久com | 粉嫩av一区二区三区天美传媒| 久久99热这里只频精品6学生| 免费av在线播放二区| 熟妇激情| 蜜臀久久99精品久久久久久无删减| 18一区二区三区| 日韩精品一区二区日韩| 偷拍亚洲| 日本 情色 1区2区3区| 欧美精品另类人妖xxxx| 国产视频不卡在线观看| 无码区蜜乳| 欧美 亚洲精品首页| 亚州高清色综合| 殴美牲| 日韩另类| 中文字幕jul-617人妻熟女| 日韩成人精品| 女性喷水高潮在线观看| rion磁力链接| 久热伊人| 99re久久| 四方色播| 四方色播| 国产一区二区在线播放| 国产免费小视频| 日产成人久久| 怡红院成人av| 美国久久一二三四| 精品人妻一区二区免费蜜桃| 综合激情97 | 97超碰中文| 骚乳在线| 午夜成人福利影视| 精品妇女一区二区三区| 啊啊啊啊嗯嗯嗯用力好爽 | 熟女乱伦A| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 中出789在线视频| 91 手机在线播放 绯色| 67914亚洲精品| 中文字幕精品一区二区精品| 亚洲精品一区中文字幕乱码| 在线日韩视频| 91在线色综合| 久久这里精品国产99丫e6| 偷拍 亚洲| 久久伊人网视频一区二区三区| 五月天偷拍| 2025亚洲男人天堂| 中文字幕在线日亚洲9| 成年人一级黄色毛片大全在线观看| 久久综合国产精品国产| 欧美日韩性爱无码| 91狠狠综合久久| 天天插天天干| 亚洲欧美精品久| 精品一国2| 亚洲男人的天堂网| 插插综合网天天影视网| 伊人91| 日日超碰亚洲| 日韩一级特黄av毛片| 久久亚洲AV无码专区首页| 可能人人看人人摸| 国产做?爰片久久毛片?片美国| 91精品无码久久久久久久| 狠狠久久手机视频精品| 久久一区二区三区入口| 99无码视频| julia在线观看久久| 99精品热| 亚洲中字慕不卡| 九九碰九九爱97超| 深夜国产一区二区三区在线看| 欧美三级中文字幕hd| 亚洲天堂电影精品一区| 伊人网在线视频| 97视频一区| 欧美91在线| 国产v片在线免费观看| 九九成人精品| 精品妇操一区二区三区| 国内偷拍精品一区二区| 人人摸人人叼| 天天内射| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 色老汉色| 天堂亚洲欧美| 性色av蜜臀av色欲aV| 五月婷婷五月天| 大香网伊人久久综合网eew| 青青操日韩| 激情小说图片亚洲首页| 二色av| 亚州综合AⅤ| 丝袜美腿亚洲| 99热自拍| 五月天人妻综合| 四虎午夜影院| 亚洲综合春色| 欧美色偷偷| 欧美啪啪女女| 蜜臀一二三| 亚洲阿v天堂在线| 26uuu国产成人综合| 97色在线观看| 超碰97久| 亚洲天天操| 久久99午夜精品一区人妻| 97人亚洲综合字幕| 蜜臀久久99精品久久久久| 国产精品久久久久久久久AV大片| 男人的天堂欧美| 试看日韩黄片| 老女人爆菊| 亚洲性爱无码乱伦av| 综合久草| A级片日韩欧美国产欧美视频精选观看 | 国产成人午夜视频网址| 一区二区不卡| 免费看黄视频亚洲网站| 18禁久极品美女久久哦哟呀!| 中文字幕蜜乳av| www.狠狠| 亚洲资源一区| 色av中文字| 蜜臀99久久国产| 国产一区二区啪啪视频| 熟妇一区,二区,三区。| 国产亚洲国产超碰| 亚洲中文字幕av | 欧美天堂在线| 澳门特级毛片免费观看| 超碰夫妻97| 欧美成人A天堂片在线观看| 亚洲色香| 国产 v乱码一区二| 5252色欧美在线男人的天堂| 亚洲男人的天堂亚洲| 亚洲一二三四区| 99久久久无码| 青娱乐亚洲自拍| 中出在线视频| 无码99| 偷拍 亚洲 欧美| sss视频华人在线| 20cm女自慰在线日韩欧美| 少妇六月天| 国产乱色国产精品免费视| 粉嫩久久久久| 国产丝袜视频| 性暴力欧美猛交在线直播| 超碰98综合网| 91在线色综合| 国产毛片在线| 加勒比海人人操超碰在线| 九九九九九九九精品视频| 精品一区二区三区国产| 91天天爱| 水野优香在线观看| 亚洲精品白浆高清久久久久久 | 人妻人人做人人澡人人爽欧美一区| 啊啊啊啊在线播放| 久久草草欧美精品| 无码免费精品高清| 丁香婷婷五月| 天天性射网| 黄页大片在线观看| 成年女人黄网站| 天天操妹子| 破苞ⅩXXX性无码动漫无码| 国产一区二区二区按摩精品啪视频| 神马久久久久眼| 操逼大黄片| 欧美日韩小说| 国产黄色剧情影片麻豆免费播放| 91成人社区| 婷婷六月天| 草草网站影院白丝内射| 97精品网| 色99久草| 日韩图区| 欧美一二三区四五区| 大香蕉综合在线| 97在线精品观看视频| 97亚洲综合在线| 九九国产| 美日韩在线不卡人妻| 口爆综合网| 青青草综合在线| 欧洲亚洲人妻无码中字久久三区四区| 青青草中文-久久青草精品一区二区三 | 亚洲动态色图| 久久久久久中文| 99xav| 黄色成品网站| 亚 欧 美 综合| 国产日本久久免费精品| 日逼视频日本| 日韩精品碰碰| 无码免费在线观看黄色片| 不卡在线观看视频| 97超碰超| 怡春院久久| 欧洲大香蕉| 久久伊人青青草| 欧美在线伊人色| 鲁鲁色综合网| 日本在线不卡123| 开心激情婷婷| 精品国产少妇高潮视频| 丁香五月av| 亚洲另类在线观看| 99热超碰在线| 97久久资源| 六月婷婷激情| 91N欧美| 91暧暧| 九一屌逼| 大香蕉在线视频重口味毛片在线| 久久亚洲天天做| 啊啊啊啊二区好大| 国产av色网| 中日韩久久久免费看| 青青草AV色| 91色欧美| 国产一级内射高清视频 | 日本天天吊| 小草精彩毛片| 情色五月天久久久| 裸体美女久久久| 蜜桃精品视频一区二区三区| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 日韩97视频!在线| 区一在线观看| 啊啊啊不要嗯嗯在线观看| 美女91色黄18| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 狠狠操狠狠| 日韩免费人妻色情网站| 97视频在线观看高清资源| 久草男人天堂| 亚洲 日本 不卡| 久久精品| 97超碰美女| 国产视频一区二区三区在线免费观看| 国产 亚洲 丝袜 制服| 强奸乱亚洲| 狼人综合婷婷激情四射 | 91精品人妻一区二区三区蜜桃| 日韩亚洲欧美中文字幕| 在线观看无码三级少妇| 嗯啊不要在线| 狠狠躁日日躁夜夜躁A| 青青操日韩| 日韩免费中文字幕视频| 熟女字幕| 大香蕉综合| 视频在线观看青青99国产| 九热中文字幕| 欧美日韩 强奸乱伦| 精品久久久久久亚洲| 国产精品欧美激在线| 久久久涩| 丰满少妇乱子伦精品无| 99re95| 99久草| 免费伦费视频在线观看| 富二代亚洲精品99| 九久9精品| 欧美aaaaaaa| 精品人人| 热热色中文无码| 东京热男人的天堂精品| 国产传媒美日韩av| 97爱爱爱| 91色碰| 天天欲望网| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 熟女人妻精品一区二区视频| 五月色网| 亚洲丝袜99| 秋霞免费无码视频日韩A片 | 婷婷色综合欧美日韩| 秋霞欧美性爰视频| 亚洲天堂电影网| 伦激情人妻另类人妻| 亚洲色图超碰在线| 酒色综合网| 超碰成人免费| 97操B| 久久肏大逼| 欧美91精彩| 国产一级内射无挡观看| 97 超碰 人人做 人人爱| 中文字幕一区二区视频在线观看| 久久人妻办公室视频| 中文字幕免费在线观看| 国产在线视视频有精品| 亚州精品人妻一二三区| 女同性恋久久| 蜜臀99久久精品久久久久久| 欧美做爰无码A片视频| 乱色老一区二区三区的观看方式| 乱伦Av网| 综合亚洲网| 五月天综合网| 丰满少妇一区二区三区免费看| 99热精品在线观看| 亚洲爽图| 亚洲少妇激情视频| 国产精品探花视频| 97 国产精品| 蜜乳av首页| 嗯嗯啊啊啊好爽| 欧美第一页性| 黄片视频,下载| 浓厚中出中文字幕在线| 日本一区二区电影网站| 午夜天天碰综合视频| 超碰这里只有精品| www.yeyecao| 媚薬在线视频麻豆| WWW黄片COM| 骚熟女AV网| 九九色色| 日B操| 啊啊啊啊啊啊啊啊啊啊在线观看| 久久草在线综合视频| 99超碰碰| 91色图片| 午夜天堂啪啪| 成年人黄色视频免费| 无码久| 亚洲精品美女久久久久久久久| 久午视频| 色妇91| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 日本肉体xxxx裸交| 性天堂| 日本欧美m v精品网站加| 综合激情婷婷| 中文字幕日韩电影人妻| 97资源站国产精品| 污污污8888| 91丨九色丨大屁股| 天天谢天天干| 91欧美综合| 欧美 综合 亚洲| 欧美亚洲丝袜人妻制服99| 精品国产乱码| 欧美碰碰综合色| 使劲用力艹少妇视频一区二区 | 久久精品无码专区| 一直超碰| 黄色二级片网站| 五月婷婷爱六月丁香色| 久久久久久亚洲Av无码| 欧美九九九九九| 在线观看视频91| 一区二区 韩日AV| blacked精品一区国产| 搡老女人老91二区| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 国语对白露脸XXXXXX| 九九九偷拍| 国产欧美后入| 亚洲视频一二区| 色综合98| 美女黄色一级A视频| 欧美十八禁网站| 超碰国产精品无码| 久久久96| 久热最新在线杭州| 久久精品操| 97欧美色综合| 老熟妇一区二区三区啪啪| 91在线免费观看处女| 国产毛片精品一区二区色欲黄A片| 在线综合色| 久久久久久久久久久免费精品| 激情小说亚洲色图| 五十路一区无码| 91精品国产91熟女| 中国熟妇| 精品一区二区三区丰满熟女-亚洲欧美一区| 加勒比综合a∨| 98超碰日本| 操少妞在线视频| 狠狠躁日日躁夜夜躁A| 小骚逼被操的爽不爽| 操死我了嗯嗯嗯| 亚州综合图片| 中文字幕乱偷人妻久久艾草网| 伊人久久亚洲中文字幕不卡| 大乔未久88一区| 人人操人人射人人干| 日韩综合97P| 青青草国产一区二区三区| 男人天堂网手机版婷婷| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 在线播放成人高清免费视频| 秋霞操逼片| 大香蕉视频一二三区| 国产一区在线观看无码AV| 欧美十八禁导航成人| 99久久久er直播网址| 欧美一级A片在线看视频性色| www…国产操逼| 五月天激情小说网| 色婷婷蜜臀av| 欧美激情亚洲情色| 男同专区一区二区三区在线| 草草电影院| 操逼免费视频无码国产| 日本午夜福利影院| 色噜噜国产在线| 欧美视频第二页| 日本免费一区二区不卡| 亚洲 在线| 手机午夜电影神马久久| 婷婷丁香五月天亚洲天堂网| 六月丁香婷| 久久九九一区二区三区成人| 91网站18+| 91美女在线观看| 精品人妻一区二区视频| 69精品人人人人| 九一综合精品视品av| 亚洲综合射| 加勒比综合88| 美女极品一区二区三区| 亚洲另类综合欧美| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 久久久久久AV无码免费网站| 久久综合18p| 看看日B真人视频| 男人午夜天堂| 国产18精品亚洲精品| 亚洲伊人久久精品狠狠在线| 懂色av中文字幕| 色欲Av人妻精品一区二| 九九RE视频在线精品| 天天弄欧美| 91丰满| 国产精品探花视频| 欧美亚洲20p| 熟妇人妻丰满久久久久久久无码| 国产毛片在线| 久久综合精品一区二区三区| 91久久婷婷| 在线中文字幕极品av| 亚洲欧美爆| 国产馆| 日韩乱插| 99久在线精品99re8| 蜜乳视频网站| 色性荡荡荡荡视频| 操熟女91| 99自拍视频在线观看| 操淫穴亚洲五月丁香| 亚洲欧洲中文日韩女优乱码| 亚洲 图片 综合91| 黄色工厂这里只有精品| 亚洲一区二区三区欧美日韩| 亚洲熟女乱综合一区二区三区 | 久久综合18p| 欧美96精品在线| 丁香六月激情| 大香蕉人妻久久| 国产又爽又黄| 91无码人妻精品一区二区三区蜜桃| 色黄色美女大长腿午夜视频| 亚州综合AⅤ| 久久久亚洲Av| 久久久久久波多野吉衣高潮| 国产91av在线播放| 一区二区三区 丝袜高跟| 成人五月天丁香激情综合| 日本天天吊| 久久久久久久强迫| 欧美精品丝袜久久久中文字幕| 校园春色五月天| 日韩在线视频1234| 26uuu最新| 欧美无圣光在线| 成人97人人超碰人人| 欧美页片| 乱伦Av网| 九九九成人| 亚洲午夜免费狠狠干| 天美传媒AV在线播放| 麻豆黄色五月天| 无码高清操逼网址| 国产精品丝袜久久亚洲不卡| 啪啪啪精品视频| 大香蕉性欧美| 麻豆视频test| 亚洲精品国产日韩无码AV永久免| 久久大精品乱码视频人妻熟女| 成人a大片在线观看| 欧美爱国产综合、| 国产原创自拍| 国产午夜福利电影免费在线观看 | 亚洲伊人成综合成人网| 亚洲欧洲色情高清| 五月天玖玖资源站| 亚洲欲色| 97国产色图| 国产免费一区在线观看| 色吧91| 国产熟女二区| 成人在线日韩| 都市久久精品激情亚洲| 亚洲风情综合网| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 91精品国产91久久福利| 97超碰逼| 婷婷五月天av| 岛国1区2区3区在线观看| 内射黑丝袜| 伊人天堂在线| a v网站在线播放| 亚洲毛片基地专区| 在线情色电影 91大| 欧美色五月| 国产日产精品久久快鸭的功能介绍| 蜜桃臀AV在线| 九九英色视频| 五月丁香综合网| xxxx网站亚洲精品| 天天看片青娱乐| 色综合久久夜色精品国产天堂| 五月天激情网图片| 黄骗免费| 在线播放成人高清免费视频| 欧美日韩狠狠爱| 日韩图区| 国产一区麻豆免费观看| 九九色色| 国产懂色精品国产av| 欧美高清18A片| 在线欧美亚洲| 亚洲AV色图一区| 又摸又舔在线观看网站| 天天综合网国产| 国产 v乱码一区二| 综合五月婷婷亚洲一区| 欧美日韩插逼视频| 欧美男人天堂| 日逼97| 偷拍亚洲视频一区二区三区四区| 超碰538| 久久中出在线| 性欧美天天| 久久9亚洲| 99国内精品| 69超碰综合| 99精品免费| 色婷视频| 色5月婷婷| 亚洲av乱伦色图网站| 国产高清在线观看欧美| 秋霞成人一级在线观看| 亚洲一区日韩精品| 2023天天操夜夜操| yw尤物av无码点击进入麻豆| 久久九色| 偷拍 欧美 日韩| 另类图片欧美激情综合| 最新日本中文字幕| 国产成人在线观看网址| 97综合国产| 久久97超碰| 久久婷婷电影网| 国产精品美女久久久久久网站| 精品视频在线观看| 国产无码成人无码| 囯产精品久久久久久久久久梁医生| 久久久亚洲| 韩国三级一线观看久| 超碰免费人妻人人| 日本免费一级AAA大片器| A 在线网址| 日韩性爱免费视频在线网站| 亚洲色图殴美色图激情乱伦| 91精品国产高清久久久久久,亚洲成人| 黄色一级视| 综合网色| 欧美久久草熟女| 久久熟妇五十路一区| 色 亚洲 91| 亚洲激情深爱文学小说网站| 国产CHASE男男GAYGA 毛多色婷婷| 新精精品久久精品| 999国产精品999久久久久久| 330Dv国产女人终合视频极品人与兽 | 国产91乱伦| 国产无码一二三区| 中文字幕一区二区三区蜜桃视频| 蜜桃久久久久久久久久久久 | 91黑人无码激情在线| 五月丁香久久| 日韩精品高清资源在线| 欧美亚洲涩涩| 久久久久久十| 亚洲黄色视频在线观看视频| 蜜臀操逼黄色视频操的好爽| 精品久久視頻在线| 中国黑人三级片网站上区| 99热18这里只有精品| 亚洲视频精选| 久久五十路熟女人妻| 性一交一乱一交A片久久四色| 久久的网站啊啊啊啊啊| 久久久久久久久国产| 97亚洲在线| 乱伦av麻豆| 国产乱码久久| 亚洲国产中文字幕| 国产精品午夜AV完会免费| 人人操,操人人| 亚洲AV无码天美传媒一区| 加勒比东京热五月天天堂网| 男人的天堂免费| 国产性久久久| 亚洲情色91| 亚洲极品| 素人一区二区三区日韩| 狠狠色婷婷| 97在线青| 亚欧无码线免费观看视频| 亚洲精品日日夜夜52| 夜夜国产一区| 亚洲欧美综合| 欧美婷婷五月天| 亚洲一二三| 人妻少妇久久中文字幕一区二区 麻豆 | 国产又色又爽又舒服的三级视频| 麻豆性爱视频在线播放| 色爱亚洲| 久久久五月天| 视频在线中文字幕| 国产精品盗摄 偷窥盗摄| 蜜桃久久综合视频| 欧美色老汉| 国产浮力影院第1页| wwe 天天干.com| 欧美中出| 天天综合网国产| 超碰久超碰久| 精品人妻美妇91job| 都市激情人妻一区二区青青操视频| 看全色黄大色大片免费视频| 亚洲综合五月天| 熟妇女伦乱视频视频| 中日韩熟女| 伊人991| 国产性爱在线视频一区二区| 操死我干死我| 国产h小视频在线观看免费| 97福利视频| 亚洲精品蜜桃久久久| 天天视频综合在线观看视频| 日本999精品视频| 91在线免费精品视频| 熟妇熟女视频一区二区三区| 怡红院成人视频| 国产99 中文字幕日韩小视频| 国产亚热在线久久| 欧日a| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 26uuu性物| 18禁在线视频| 肥臀熟女福利视频一区二区| 牛牛AV人人夜夜澡人人爽| 伊人国产av| 国产真乱mangent| 四虎国产成人精品免费一女五男| 国产一区二区三区白丝| baiduhicn.com。| 综合欧美激情网| 蜜桃臀久久| 成人丁香五月| 国产成人久久精品蜜臀| 成人A片男人的天堂| 操b在线观看| 天美传媒Av在线| 三级三级三级a级全黄三| 9九九国产| 99在线免费观看| 国产老女人久久毛| 九九久久国产精品| 日日操丁香五月天| 天天肏夜夜肏| 嗯嗯啊啊啊好舒服| 中国一级操逼视频| 国产精品另类一区大香蕉| 嗯啊不要啊在线| 国产亚洲精品精AV.| 亚洲综合 欧美| 婷婷色综合| 91色人妻| 午夜九九| 美女高潮视频91| 手机在线人成免费视频| 不卡视频一区蜜桃视频 | av草草在线电影| 成人资源中文字幕在线观看天天| 人妻干天天| 国产又长又大又粗的视频| 性站| 夜间福利片1000无码| 欧美天天综合在线| 青青草男人天堂| 丁香九月婷婷| 韩国一级婬片A片无码天美| 国产蜜臀精品一区二区尤物| 夜夜操天天肏| 激情色播| 欧亚成人| 亚洲精品久久久久毛片A片拉屎 | 超清中文乱码字幕| 91精品国产乱码| 国产伦精品免编号公布| 亚洲精品第一| 日本黄大片在线观看视频| 亚春色色| 校园春色亚洲无码| 国产精品乱人伊人网| 福利色色| 国产女人高潮嗷嗷嗷叫小说| 欧美综合另类| 熟女熟妇一区二区三区视频| 男插女青青影院| 久久久久13| 日本亚洲熟女视频| 思思热免费在线视频| 亚洲欧美综合| 夜夜性| 91欧美少妇| 亚洲色悠悠久久88| 韩日男人的天堂| 91久久久久免| 中文久久| 国产天美传媒精品| 丁香五月影院| 在线精品福利免费播放| 高潮毛片无遮挡高清免费| 淫荡网址| 九热中文字幕| 大香蕉中文网| 久久r精品| 校园春色欧美| 国产精品一区二区后入| 亚洲欧美setu| 情色五月天久久久| 国产性感骚丝袜在线| 久久黄黄| 天天综合网一91网| 日韩精品一区二区三区四虎影视| 狠狠操综合| 爱我干综合| 人人色人人操在线| 成人网址在线观看| 337p大胆噜噜噜噜噜91Av| 国模精品一区二区三区苹果色戒 | 校园春色制服丝袜中文字亚洲| 五月综合激情网| 五月丁香啪啪| 先锋精品av色鲁| 精品久久視頻在线| 色爽爽文学| 无码91| 国产美脚女优尤物在线观看| 97内射偷拍| 神马久久久久久久久久| 欧美一区二区成人一卡| 超碰97在线色男人??| 久久是精品| 蜜臀久久99精品久久久久电影| 久伊人网78| 欧美性暴力| 国产精品日本无码A片| 国产一区二区三区白丝| 91社操逼| 色色激情五月天| 91久久精品国产| 亚洲免费日韩在线一区二区| 九九九九九九九九九九九九九九九女| 天天插天天操天天摸天天射天天看| 九草九九九| 狠狠爱大香蕉| 免费久久一级毛片大黄| 精品成人动漫一区二区| 一级免费啪啪片| 天天爽爽爽爽| 久久久久久波多野吉衣高潮| 九九九九九九免费视频| 精品国产乱码久久久久久网站入口| yaouchengrenav| 国产三级多多影院2022国产AA一级毛片无码 | 夜夜天天噜狠狠爱2021| 日韩欧美亚洲一区二区三区影院| www99热| 国产AV人人 夜夜人人澡| 人妻少妇久久| 1769成人国产精品视频| 手机在线播放国产福利| 五月天大香蕉| 超碰精品| 中文三一区| 天天插夜夜操| 亚洲激情综合| 日本东京热大香蕉a片| 久操免费电影| 亚洲色图尤物视频| 婷婷六月色| 超碰夫妻97| 91爱啪| 日韩 欧美 视频 在线 一区| 日本三级中国三级99人妇网站| 操死我了嗯嗯嗯| 亚洲欧美不卡线| 夜色AV无码手机在线影院| 99999精品视频| 91网站18+| 亚洲伊人久久综合97| 亚洲图片欧美在线视频| 欧美少妇内射| 大奶的诱惑| 强奸乱伦av电影| 亚欧美天堂在线| 欧美色蜜桃97| 十八禁的黄污污免费网站| 91男女啊啊啊| 亚洲少妇综合| 在线观看亚洲专区| 大香蕉色网| 女人精品内射国产99| 久久久婷| 欧美另类天堂| 日本天天操| 亚洲在高跟鞋自慰久久在色线| 欧美色图亚洲激情| 99久久婷婷| 伊人四虎综合| 人人艹亚洲| 91网亚洲| 欧美v日韩v亚洲v最新在线| 99操碰| 欧美女同在线| 熟女五十路一区二区三| 九九九九九九九九九九九免费国产| 精品人妻久久久久一区二区三区| 成人 日本A片无码8888| 久久国模av| 亚洲av国产av综合av卡| 人人妻人人操人人乐| 天天做天天爱| 丁香六月天| 天天操天天舔| 日本在线一二| 奶水 人妻 哺乳 在线| 日本三级韩三级99久久| 超碰偷拍| 中文字幕在线免费观看视频| 亚洲 欧美 日韩另类 麻豆| 秋霞曰韩R级| 综合色久欲| 乱伦熟女区| 日本精品加勒比海一区| 影音先锋中文字幕日本好一区二区| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 久久综合激情| 青青操在线视频| 婷婷久久综合久| 青娱乐妇女性生活| 99热色这里只有精品| 国产强奸乱伦无码视频| 亚洲欧美爆| 亚洲激情综合另类男同| 日本中文字幕一区| 国产色呦呦| 密臀在线视频| 人人爽天天爽| 国产兽交视频在线播放| 日韩图区| 久久久 国产精品| 国产精品农村妇女| 91精品成人www| 亚洲春色欧美激情自拍| 不卡一区视频| 中文字幕在线日亚洲9| 欧美色网络| 欧美综合色站| 高清无码 国产精品| 97在线视频观看免费| 亚洲,欧美,春色,另类| 强奸抽插av| 亚洲在钱| av天天在线观看| 天堂а√在线最新版在线| 97欧美色| 熟妇人妻一区二区三区| 啪啪资源网| 97超碰欧美精品| 久久中文色图| 国产女人成人精品视频| 啊啊啊啊啊在线| 97在线无精品 | 青青草好吊色| 久插综合| 欧美国产日韩高清在线| 国产又黄又粗又猛大片| 蜜臀久久精品久久久久视频| WWW美腿丝袜香蕉中文| 亚洲综合九九| 国产亚洲精品A在线观看下载| 97欧美色综合| 九久9热| 婷婷丁香五月激情啪啪| 国产极品粉嫩馒头一线天av| 人伦四五区| 亚洲丝袜色图| 日本99久久| 超碰人妻天天干| 日日骚AV| 中文字幕av片| 九九九久久久久| 人人操av| 美國A片| 欧美精品精品一区二区| 一本大道久| 色老牛| 亚洲熟女国产综合另类| 极品白嫩美女白浆成人福利在线看| 一区二区久久天天干狠狠| 99黄页网站| 久久超碰爱| 国产伦乱91| 性爱视频无打码在线观看| 亚洲欧美情色| 91痴汉| 欧美一级专区免费大片| 九九九九88| 五月天激情视频| 手机在线看片免费人成视频| 国产9 9在线 | 亚洲| 女性91网站| 欧美日韩色| 日韩精品资源| 九9热伊人| 乱欲性色| 99啪啪| 肥臀熟女福利视频一区二区| 东京热激情视频一二三区| 免费视频a级毛片免费视频| 骚货操死你| 国产人伦精品一区二区三区 | 亚洲男人天堂网久久| 四虎在线免费视频| 国产乱码精品久久久久久| 超碰 另类 欧美 | 狠狠超| 日本二三四区| 天天操福利视频综合网站| 丝袜色综合| 久久久久久久9最新免费视频观看| 蜜桃视频一区二区三区在线观看| 神马视频久久久久久| 91爽啪| 日韩AV电影网站| 综合熟女| 麻豆60秒| 18精品一区| 熟妇人妻一区二区三区| 丰满欧美少妇| 亚洲不卡AV在线| 麻豆天美国美国产| 国产欧美一区二区| 亚洲中文字幕有码视频一区二区三区| 日韩pv中文| 九月AV| 欧美猛交黑寡妇中文字幕| 手机久操欧美综合色码| 中亚黄色三级大片| 欧美体内射精| 男人的天堂com|