## 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 (點這邊會有大圖,比較清楚)
### 練習題目
---
請使用上面那段程式碼處理 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 的資料,記得都要加個逗號的字串。(如下圖範例)

* 第二個需要處理的部分:
(07)335-1121#2293
而這個資料的問題是因為前面的大括號是全形的,
請幫我使用程式修改,改為跟其他資料一樣的半形括號,然後輸出至 csv 即可。
**提示:可以用 String 的 replace,把大括號取代成小括號即可。**
 用程式修正後的結果
https://i.imgur.com/o2vWQNd.jpg 大圖點這邊
---
以上題目就盡量自己能力做,有任何問題都可以發問。
加油