---
# System prepended metadata

title: Untitled

---

## 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 大圖點這邊

---

以上題目就盡量自己能力做，有任何問題都可以發問。

加油

