1. 程式人生 > >csv檔案匯入時"換行符"問題的解決思路

csv檔案匯入時"換行符"問題的解決思路

前提是資料是以"\t"分割,每個資料以"\""包裹,換行符為"\r\n"

1.準備String dataApp = AppConstants.EMPTY;用來拼接字串

2.如果讀取的資料中存在換行符,而此換行符是夾在某一條資料裡的,則需要讀取多次進行拼接處理
        String appendFlagCheck = AppConstants.EMPTY;
        dataApp = dataApp.replace("-", "");
        //若“概要”,“商品名字”,“商品管理專案”中存在換行符則需要讀取多次進行拼接處理
        if (!dataQ.isEmpty()) {
            String dataStr[] = dataQ.split("\"",-1);
            int countDataApp = dataApp.split("\t").length;
            if (countDataApp != checkCount) {
                //eg形式:商品名" [商品名,]
                if (dataQ.contains("\"") && dataStr.length == 2 && StringUtils.isNotEmpty(dataStr[0]) && !StringUtils.isNotEmpty(dataStr[1])) {
                    dataApp += dataQ + "\t";
                }
                //eg形式:"商品名 [,商品名]
                else if (dataQ.contains("\"") && dataStr.length == 2 && StringUtils.isNotEmpty(dataStr[1]) && !StringUtils.isNotEmpty(dataStr[0])) {
                    dataApp += dataQ + "\r\n";    
                }
                //eg形式:正常的資料 "商品名"
                else if (dataQ.contains("\"") && dataStr.length == 3) {
                    //eg形式:這一行的最後一個數據是正常資料。
                    int countDataApp2 = countDataApp + 1;
                    if (countDataApp2 == checkCount) {
                        dataApp += dataQ;
                        dataApp = dataApp.replace("-", "");
                        appendFlagCheck = Constants.SUCCESS;
                    }
                    else {
                        dataApp += dataQ + "\t";    
                    }    
                }
                //eg形式:不帶雙引號(概要或名字裡面的內容)
                else if (!dataQ.contains("\"")){
                    dataApp += dataQ + "\r\n";
                }
                //eg形式:開頭第一個資料是一個單獨的雙引號--> " "正常資料"....
                else {
                    dataApp += "\"" +  "\t";
                }
            }    
            else{
                //商品管理メモ中テキストの設定為這一行資料的最後一項時
                //eg形式:這一行的最後一個數據:"FE(E後面存在換行)
                if (dataQ.contains("\"") && dataStr.length == 2 && StringUtils.isNotEmpty(dataStr[1]) && !StringUtils.isNotEmpty(dataStr[0])) {
                    dataApp += dataQ + "\r\n";
                }
                //eg形式:這一行的最後一個數據:(E前面存在換行)EG"(徹底結束)
                else if (dataQ.contains("\"") && dataStr.length == 2 && StringUtils.isNotEmpty(dataStr[0]) && !StringUtils.isNotEmpty(dataStr[1])){
                    dataApp += dataQ;    
                    dataApp = dataApp.replace("-", "");
                    appendFlagCheck = Constants.SUCCESS;
                }
                //eg形式:這一行的最後一個數據:不帶雙引號(E前面存在換行)E(E後面也存在換行)
                else if (!dataQ.contains("\"")){
                    dataApp += dataQ + "\r\n";
                }
                //eg形式:這一行的最後一個數據:最後一個引號前面有換行符FEG(換行符)"(徹底結束)
                else {
                    dataApp += "\"";
                    dataApp = dataApp.replace("-", "");
                    appendFlagCheck = Constants.SUCCESS;
                }
            }        
        }
        //eg形式:沒有任何內容只有一個換行符
        else {
            dataApp += "\r\n";
        }
        if (appendFlagCheck == Constants.SUCCESS) {
            return dataApp;    
        }
        else {
            return "-" + dataApp;//用逗號作為一個標識表示拼接未結束
        }
                                    String dataAppStr[] = dataApp.split("\t",-1);    
          3.如果表頭列數與資料列數一致,則組成鍵值對形式用於儲存資料
                                    if (dataAppStr.length == checkCount) {
                                        for (int p = 0; p < dataAppStr.length; p++) {
                                            if (!dataAppStr[p].isEmpty()) {
                                                dataAppStr[p] = dataAppStr[p].replace("\"", "");
                                            }    
                                        paramData1.put(lineOneCellFirstStrList.get(p), dataAppStr[p]);
                                        }
                                        appendFlag = true;
                                    }
                                }