iT邦幫忙

0

JAVA CSV如何加總

想請問一下,如何可以在數字有千位數逗號的情況下求出SUM值!

下面是目前寫出來的部分,可是sum都是顯示0
https://ithelp.ithome.com.tw/upload/images/20211021/201431676MyS9WC8jV.jpghttps://ithelp.ithome.com.tw/upload/images/20211021/201431671uUljqlCcz.jpg
員工編號,姓名,薪水,年齡
1,王小明,"1,000",20
2,李大華,"2,000",50
3,陳中黑,"2,100",25
4,陳大大,"3,000",35
5,秦壽生,"1,500",18
sum=0

froce iT邦大師 1 級 ‧ 2021-10-21 16:06:43 檢舉
把逗號replace掉啊...
2

我不熟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加總
結束

2
DennisLu
iT邦新手 4 級 ‧ 2021-10-21 17:05:41

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寫以上講的並不難。一定可以寫出來。

3
海綿寶寶
iT邦大神 1 級 ‧ 2021-10-21 22:58:19

https://ithelp.ithome.com.tw/upload/images/20211021/20001787QuS0kVves5.png

原本

...
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;
    }
2
史帝夫
iT邦新手 4 級 ‧ 2021-10-22 09:24:42

若會使用正規表達式的話,可用這方式取出薪水欄位,後將字串轉為數字,就可以進行累加

撈出需要的字串
https://ithelp.ithome.com.tw/upload/images/20211022/2010774400BBcacxYL.png
接下來就簡單了,處理成數字進行累加
https://ithelp.ithome.com.tw/upload/images/20211022/20107744Rjbed9kXXU.png

1

參考這個

        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();

我要發表回答

立即登入回答