# 透過Python將CSV中的車牌放到最後一個欄位
###### tags: `python`
[GitHub](https://github.com/JingShun/PythonScript/blob/main/transLicensePlate.py)
2022/04/17
週五審計處的一位劉大哥透過別人轉介來找我,
問說怎麼透過Excel把車牌資訊撈出來放到最後一個欄位
怎麼從一大串文字中取出車牌?
當然是透過REGEX(正規表示式)呀
但印象中Excel不支援,
所以只能透過其他工具處理,
比如說匯出成CSV,
接著讓其他工具接手
那位劉大哥他聽過Python,
那就用Python處理吧
我對Python不熟,
正好來學習一下
## 撈取車牌
汽機車可能格式 e.g.
AAA-001, AA-0001, GA-A01, AAA-DZZ, KPA-0001, AA-A1 .....
可以總結出符號`-`的前後各會有2~4個大寫英文或數字,
因此可以這樣設計
REGEX格式: `[\dA-Z]{2,4}-[\dA-Z]{2,4}`
## 程式
我的目錄結構如下:
demo.csv是我的範例資料
transLicensePlate.py是程式主體

主程式`transLicensePlate.py`如下:
```python=
import re # 處理正規表示式
import csv # 處理CSV
import sys # 讀取命令參數
# 要分析的原始檔案(僅限csv)
fileName = sys.argv[1] if len(sys.argv) > 1 else 'data.csv'
# 處理後另存檔案
reportName = sys.argv[2] if len(sys.argv) > 2 else 'report.csv'
# 解決大檔按導致的錯誤
maxInt = sys.maxsize
try:
csv.field_size_limit(maxInt)
break
except OverflowError:
maxInt = int(maxInt/10)
# 開啟原始 CSV 檔案
file = open(fileName, encoding='utf8')
rows = csv.reader(file)
# 另存 CSV 檔案
newFile = open(reportName, 'w', newline='', encoding='utf8')
writer = csv.writer(newFile, delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
# 處理每行資料
for row in rows:
# 取出該筆資料中全部車牌
card = re.findall("[\dA-Z]{2,4}-[\dA-Z]{2,4}", ' '.join(row))
# 將取出的車牌附加到該筆資料的最後面
row.append(', '.join(card))
# 另存資料
writer.writerow(row)
print(row)
```
## 執行方法
執行有兩種方法
```
# 使用方法一:
# 假設原始檔名 data.csv,將會產出report.csv
python3 transLicensePlate.py
# 使用方法二:
# 格式: transLicensePlate.py <來源> <輸出目標>
python3 transLicensePlate.py data.csv report.csv
```

## 執行結果
執行後就會多一個結果檔案

原始csv資料
有沒有雙引號包起來都ok

處理後csv資料

用Excel打開ok
