實現自己的csv檔案解析引擎

2021-08-31 17:06:23 字數 3062 閱讀 7924

前言:

這裡僅僅支援excel檔案匯出的csv檔案,解析的核心是乙個正規表示式,這個正規表示式取自《精通正規表示式》一書中,感謝作者。

1、解析引擎結構圖

2、很懶很懶,直接上**了

/**

* csv 檔案解析

* * @param * @param xmlinputstream

* @param clazz

* @param file

* @return

*/protected listparse(inputstream xmlinputstream, classclazz, inputstream file)

/*** 獲取物件屬性與csv頭部檔案的對映map

* key:csv檔案頭部中文

* value:對映類的屬性

* * @param xmlpath

* @return

*/@suppresswarnings("unchecked")

protected mappar***mlconfig(inputstream in)

} catch (throwable e)

return metadatamap;

}/**

* 獲取對映物件的執行例項

* * @param * @param clazz

* @return

*/private t getinstance(classclazz) catch (throwable e)

return obj;

}/**

* 校驗map中的metadata資訊與clazz中的屬性是否完全匹配

* * @param * @param metadatamap key:中文描述 value:類屬性

* @param obj

*/private void checkproperty(mapmetadatamap, t obj)

}for (string fieldname : fieldlist)

}if (metadatamap.size() != fieldlist.size())

}/**

* 解析csv檔案

* * @param * @param file

* @param obj

* @param metadatamap key:中文 value:字段屬性

* * @return

*/private listparsecsvfile(inputstream file, classclazz,

mapmetadatamap)

continue;

}//對映類的屬性名稱

if (cellseq >= headinfo.size())

string propertyname = metadatamap.get(headinfo.get(cellseq));

if (stringutil.isblank(propertyname))

mapline.put(propertyname, field);

}//解決這個正則的乙個缺陷,類似這樣的csv格式解析有誤",a,bab,a,c,c"(第乙個單元格資料為空),現在會直接跳過

firstcellisnotnull(cellseq, line, headinfo);

//填充對映物件的屬性值

if (lineseq > 1)

setobjectvalue(tempobj, mapline);

datas.add(tempobj);}}

} catch (revmngexception re) catch (throwable e)

return datas;

}/**

* 解決這個正則的乙個缺陷,類似這樣的csv格式解析有誤",a,bab,a,c,c"(第乙個單元格資料為空),現在會直接跳過

* * @param cellseq

* @param line

*/@suppresswarnings("unchecked")

private void firstcellisnotnull(int cellseq, string line, listheadinfo)

string contens = line.split("[,]");

listlists = arrays.aslist(contens);

stringbuffer linebuffer = new stringbuffer();

for (int i = 0; i < headinfo.size(); i++)

}if (!collectionutils.isempty(lists) && cellseq == 0)

}/**

* 獲取matcher

* @param line

* @return

*/private matcher getmatcher(string line)

/*** 獲取解析的乙個單元值

* @param matcher

* @param mquote

* @return

*/private string getfield(matcher matcher, matcher mquote)

/*** 設定一行對映物件的屬性值

* * @param * @param object

* @param mapline key :屬性名稱 value:屬性值

* @throws illegalacces***ception

* @throws illegalargumentexception

*/private void setobjectvalue(t object, mapmapline)

throws illegalargumentexception,

illegalacces***ception

if (mapline.containskey(f.getname())) }}

只是一些關鍵**而已,別人不一定看得明白,自己mark一下。。哇哈哈哈。。。

解析csv檔案

以下內容僅為記錄 第一步 解析csv檔案 test public void testcsv throws exception catch filenotfoundexception e string line string everyline try system.out.println csv 中...

CSV檔案解析

實現功能 針對讀取的csv文件字串進行map格式輸出 主要 如下 public class csvpaser extends parser public static void main string args system.out.println map 說明 該部分主要針對多條記錄做相應的解析 ...

Unity中實現解析CSV檔案

在我們的專案開發過程中,策劃們可能會配置很多的資料在一些文字文字中,例如 物品,隨機名稱等,往往這些資料會放在不同的csv檔案中 逗號分隔值 comma separated values 其檔案以純文字形式儲存 資料,資料與資料之間用英文逗號分割 下面兩張圖為excel 形式轉換為csv形式 建立e...