我不熟java,但加減看得出...以下
你用,來分割
這樣column[2]
切下來不就會變成
"1
"2
"2
"3
"1
然後他們都不是number,所以if根本沒進去?
下中斷點看一下就很清楚了
以這個CSV來做應該是沒救,我覺得要把檔案的分割符號替換成別的,例如;
再來提出包含千分符號的字串 1,000 2,000 2,100 3,000 1,500
接著java應該有套件方法(我知道C#有),或者用replace
把此字串換成真正的數字 1000 2000 2100 3000 1500
最後sum加總
結束
1,王小明,"1,000",20
2,李大華,"2,000",50
3,陳中黑,"2,100",25
4,陳大大,"3,000",35
5,秦壽生,"1,500",18
接資料常常遇到不如預期的格式,
總有機會加工資料讓自己能順暢跑
像這種狀況也可以土法一點
先寫一隻程式前期加工並另存檔案(保留原始檔案比對用)
程式過程:
把每行的," 與 ",之間的字串特殊符號處理掉為不帶符號純數字
再處理每行的 "
結果出來
1,王小明,1000,20
2,李大華,2000,50
3,陳中黑,2100,25
4,陳大大,3000,35
5,秦壽生,1500,18
另外寫成csv存檔,用你本來要跑的程式帶入
保留另存的CSV檔案,也可以存著用在別支也要讀這資料的程式
如果你的目的只是要得出加總的話。
擷取每行的," 與 ",之間的字串 得到 1,500
轉為數字再加總。
所以也不一定要存成檔案,直接都在記憶體內做掉直接運算也可。
可是要注意自己的程式,別設計不當,導致遇到量大的狀況沒處理好記憶體一直吃上去。
可以說我用嘴巴寫程式不給code,java寫以上講的並不難。一定可以寫出來。
原本
...
while ( (line = br.readline()) != null ) {
System.out.println(line);
final String[] columns = line.split(",");
...
改成
...
while ( (line = br.readline()) != null ) {
System.out.println(line);
String normalLine = normalFormat(line);
final String[] columns = normalLine.split(",");
...
至於 normalFormat 如下
簡單說就是把 CSV 弄得「正常」一點
public static String normalFormat(String str) {
String[] arr = str.split("\"");
String sRet = arr[0] + arr[1].replace(",","") + arr[2];
return sRet;
}
若會使用正規表達式的話,可用這方式取出薪水欄位,後將字串轉為數字,就可以進行累加
撈出需要的字串
接下來就簡單了,處理成數字進行累加
var result = Files.lines(Paths.get("xxxxxx.csv"))
.skip(1)
.map( line -> line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"))
.map( columns -> columns[2].replaceAll("[\",]",""))
.mapToInt( column -> Integer.valueOf(column) )
.sum();