## 20230402 練習題目 ```java //讀取 // 路徑跟檔名要修正成自己電腦的 String path = "/Users/swallow/Documents/tmp/112ca071120206-.csv"; List<String> list = new ArrayList<String>(); try (BufferedReader reader = new BufferedReader(new FileReader(path))) { String line = reader.readLine(); while (line != null) { list.add(line); line = reader.readLine(); } } catch (IOException e) { e.printStackTrace(); } //設定日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //寫入 // 路徑跟檔名要修正成自己電腦的 String destpath = "/Users/swallow/Documents/tmp/112ca071120206-dest.csv"; try (BufferedWriter writer = new BufferedWriter(new FileWriter(destpath, false))) { // 下面這行會加入 BOM 字元,讓 excel 可以辨認出是中文,而不會變成亂碼 writer.write('\ufeff'); for (int i = 0; i < list.size(); i ++) { String content = list.get(i).replace("\"", ""); // 把 " 替換掉 String[] arr = content.split(","); // 分割後,陣列長度應該要是 6 // 如果對下述流程不能理解,只是想單純先學習處理讀取後的資料,也沒關係。 // 可以用文字編輯器打開 csv 檔,把換行的那些資料手動處理掉。 // 修正完之後把下面這個 if 的區塊標註掉即可。 if (arr.length < 6) { // 如果 arr 的長度不是 6, 代表有些資料被放到下一行去了 // 所以我直接拿下一行的資料(i + 1)接上來,並把 " 去除 content += list.get(i + 1).replace("\"", ""); // 把資料寫進文件 writer.append(sdf.format(new Date()) + "," + content + "\n"); writer.flush(); // 添加Flush機制 // 因為下一個 i 提早做了,用 continue 跳過下個 i 的處理流程 i ++; continue; } // 因為 arr 的長度為 6, 代表資料正常, 就直接寫入檔案了 writer.append(sdf.format(new Date()) + "," + content + "\n"); writer.flush(); // 添加Flush機制 } } catch (IOException e) { e.printStackTrace(); } ``` 我對寫入檔案的部分做了一些修正,讓 excel 可以正常讀取 csv,不會亂碼。 另外我對原始的檔案資料做一些處理,原本有一些髒資料,導致會換行。 而目前的方法匯入到新檔案會解決 99% 的換行問題。 可以拿原本的寫入檔案,跟新方法的寫入檔案做一些比較。 (不過還是有一筆資料不容易修正(像是佑平居家護理所),就先不要管他。) 輸出後的畫面,應該會長的跟下面這張圖差不多。 ![](https://i.imgur.com/8SGoif5.jpg) https://i.imgur.com/8SGoif5.jpg (點這邊會有大圖,比較清楚) ### 練習題目 --- 請使用上面那段程式碼處理 csv 檔案。 因為已經有處理好換行跟文字編碼,所以只要著重在文字處理的部分就好。 1, 請幫我調查,每個行政區各有多少間特約單位。 **提示:把每行資料用 String 的 split 方法分割後, 在寫入時,取索引值為 2 的值就是『區域名稱』,(讀取檔案時,索引值是 1) 如果不確定哪個索引會拿到什麼樣的值,可以試著先印出來看看確認一下。 再來,將其加入 map 就可以知道哪個區域有多少家特約單位。 跟之前學生分數那個練習題的概念有點類似,可以參考看看。** 2, 請幫我調查,目前的特約單位有多少間使用手機號碼聯絡,有多少間使用市話聯絡。 **提示:(07) 或者 07 開頭的字樣就視為市話,即使他有附上手機號碼。 而 09 開頭的數字視為手機。兩者都可以用 String 的 startsWith 方法來做判斷。** 3, 請幫我調查『護理所, 治療所, 診所, 醫院』的特約單位,各有幾家。 **提示:使用 String 的 contains 方法,可以找出特約單位名稱的字串中, 有沒有我要找的關鍵字,有的話,那個類型的特約單位就 +1 。 不過有幾家的類型會重疊,但沒關係,只要知道大略數字就可以了。** ### 進階題目 --- 圖片裡面有五個紅框框起來的地方,我覺得他的格式很奇怪, 請想辦法幫我修正這五個地方。 * 第一個需要處理的部分: 0982955348、0910639569、0970031713、0963203932 這四個手機號碼資料的問題是因為沒有用 - 隔開,所以 excel 認為他是純數字。 請幫我將這四個數字做一下處理,讓程式輸出至 csv 時在第四位後有多一個 - 符號。 舉例來說會看到 0982-955348 這樣的字樣。 **提示:先跑陣列的迴圈,用 StringBuilder 把每一個值都加進去, 有遇到 09 開頭(startsWith),且長度為 10 的字串(length), 應該就是我們要變更的值。** **這時可以用 String 的 substring 方法處理, 舉例來說,substring(0, 4) 會得到 0982, 而 substring(6) 會得到 955348, 然後再拼接一個 - 就可以了。** **手機的值變更完再加進 StringBuilder 即可。** 另外,每個加進去 StringBuilder 的資料,記得都要加個逗號的字串。(如下圖範例) ![](https://i.imgur.com/KNwJdrY.png) * 第二個需要處理的部分: (07)335-1121#2293 而這個資料的問題是因為前面的大括號是全形的, 請幫我使用程式修改,改為跟其他資料一樣的半形括號,然後輸出至 csv 即可。 **提示:可以用 String 的 replace,把大括號取代成小括號即可。** ![](https://i.imgur.com/o2vWQNd.jpg) 用程式修正後的結果 https://i.imgur.com/o2vWQNd.jpg 大圖點這邊 --- 以上題目就盡量自己能力做,有任何問題都可以發問。 加油