Java讀取CSV文件(CSV文件數(shù)據(jù)內(nèi)容包含逗號(hào)處理)

最近在公司寫(xiě)項(xiàng)目時(shí),有個(gè)導(dǎo)入csv格式文件數(shù)據(jù)的需求。Java讀取csv文件時(shí)默認(rèn)是按照?,[英文逗號(hào)]分割的,若是數(shù)據(jù)內(nèi)容不包含逗號(hào)的話就簡(jiǎn)單多了,但遇到的問(wèn)題就恰巧是尷尬的地方。

如果你看到這篇文章,應(yīng)該也是遇到相同的問(wèn)題了吧

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 解決方案二

看到的文章中,覺(jué)得比較好的解決方案就是使用正則進(jìn)行匹配,讀取的csv數(shù)據(jù)默認(rèn)是用雙引號(hào)包起來(lái)的,在最后的截取中,如果只按照雙引號(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();? ?

? ? ? ? }

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,548評(píng)論 0 4
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,890評(píng)論 0 13
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 5,160評(píng)論 1 114
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,988評(píng)論 0 11
  • 50道經(jīng)典Java編程練習(xí)題,將數(shù)學(xué)思維運(yùn)用到編程中來(lái)。抱歉哈找不到文章的原貼了,有冒犯的麻煩知會(huì)聲哈~ 1.指數(shù)...
    OSET我要編程閱讀 7,277評(píng)論 0 9

友情鏈接更多精彩內(nèi)容