---
# System prepended metadata

title: 透過Python將CSV中的車牌放到最後一個欄位
tags: [python]

---


# 透過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是程式主體
![](https://i.imgur.com/f4C9fYh.png)


主程式`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

```
![](https://i.imgur.com/fPBLZhM.png)


## 執行結果
執行後就會多一個結果檔案
![](https://i.imgur.com/EMA19cF.png)

原始csv資料
有沒有雙引號包起來都ok
![](https://i.imgur.com/qsTxEKb.png)

處理後csv資料
![](https://i.imgur.com/RyOwnXb.png)

用Excel打開ok
![](https://i.imgur.com/f2gfo0a.png)

