最近在公司寫項(xiàng)目時(shí)悼凑,有個(gè)導(dǎo)入csv格式文件數(shù)據(jù)的需求违帆。Java讀取csv文件時(shí)默認(rèn)是按照?,[英文逗號(hào)]分割的涧偷,若是數(shù)據(jù)內(nèi)容不包含逗號(hào)的話就簡單多了潭流,但遇到的問題就恰巧是尷尬的地方。
如果你看到這篇文章试溯,應(yīng)該也是遇到相同的問題了吧
1.1 解決方案一(推薦)
pom.xml
<dependency>?
?????<groupId>com.opencsv</groupId>?
?????<artifactId>opencsv</artifactId>
?????<version>4.4</version>
</dependency>
1.2 代碼示例
public void readCSV() {
? ? ? ? String srcPath = "D:\\data\\line.csv";
? ? ? ? String charset = "utf-8";
? ? ? ? try (CSVReader csvReader = new CSVReaderBuilder(new BufferedReader(new InputStreamReader(new FileInputStream(new File(srcPath)), charset))).build()) {
? ? ? ? ? ? Iterator<String[]> iterator = csvReader.iterator();
? ? ? ? ? ? while (iterator.hasNext()) {
? ? ? ? ? ? ? ? Arrays.stream(iterator.next()).forEach(System.out::print);
? ? ? ? ? ? ? ? System.out.println();
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
2.1 解決方案二
看到的文章中蔑滓,覺得比較好的解決方案就是使用正則進(jìn)行匹配,讀取的csv數(shù)據(jù)默認(rèn)是用雙引號(hào)包起來的遇绞,在最后的截取中键袱,如果只按照雙引號(hào)外的逗號(hào)截取,不就是能得到想要的數(shù)據(jù)了摹闽。
2.1 代碼片段
/**
? * @param srcPath? csv文件路徑
? */
private void readCSVFileData(String srcPath) {
? ? ? ? BufferedReader reader = null;
? ? ? ? String line = null;
? ? ? ? try {
? ? ? ? ? ? reader = new BufferedReader(new FileReader(srcPath));
? ? ? ? } catch (FileNotFoundException e) {
? ? ? ? ? ? logger.error("[讀取CSV文件蹄咖,插入數(shù)據(jù)時(shí),讀取文件異常]");
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? String[] fieldsArr = null;
? ? ? ? int lineNum = 0;
? ? ? ? int insertResult = 0;
? ? ? ? TableInfo tableInfo = new TableInfo();
? ? ? ? tableInfo.setTableName(tableName);
? ? ? ? try {
? ? ? ? ? ? List listField;
? ? ? ? ? ? while ((line = reader.readLine()) != null) {
? ? ? ? ? ? ? ? if (lineNum == 0) {
? ? ? ? ? ? ? ? ? ? //表頭信息
? ? ? ? ? ? ? ? ? ? fieldsArr = line.split(",");
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? //數(shù)據(jù)信息
? ? ? ? ? ? ? ? ? ? listField = new ArrayList<>();
? ? ? ? ? ? ? ? ? ? String str;
? ? ? ? ? ? ? ? ? ? line += ",";? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? Pattern pCells = Pattern
? ? ? ? ? ? ? ? ? ? ? ? ? ? .compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");
? ? ? ? ? ? ? ? ? ? Matcher mCells = pCells.matcher(line);
? ? ? ? ? ? ? ? ? ? List cells = new LinkedList();//每行記錄一個(gè)list
? ? ? ? ? ? ? ? ? ? //讀取每個(gè)單元格
? ? ? ? ? ? ? ? ? ? while (mCells.find()) {
? ? ? ? ? ? ? ? ? ? ? ? str = mCells.group();
? ? ? ? ? ? ? ? ? ? ? ? str = str.replaceAll(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
? ? ? ? ? ? ? ? ? ? ? ? str = str.replaceAll("(?sm)(\"(\"))", "$2");
? ? ? ? ? ? ? ? ? ? ? ? cells.add(str);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? //從第2行起的數(shù)據(jù)信息list
? ? ? ? ? ? ? ? ? ? listField.add(cells);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? lineNum++;
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();? ?
? ? ? ? }
? ? }