「公保與勞保資料匯入」修訂間的差異

出自跨校選修
跳至導覽 跳至搜尋
 
(未顯示同一使用者於中間所作的 36 次修訂)
行 6: 行 6:
  
  
===CSV 資料匯入 MySQL===
+
===DS720+ 的 adminer 的讀檔測試===
adminer 無法以 「load data local infile…」匯入 CSV
+
* SHOW VARIABLES LIKE 'secure_file_priv';
 +
*#若為情況一:secure_file_priv = NULL 代表 '''完全禁止 LOAD DATA INFILE'''
 +
*#若為情況二:secure_file_priv = /var/lib/mysql-files/ 代表 '''只能從這個目錄讀檔'''
 +
*#結果是情況三:secure_file_priv = (空白) 代表 '''任何目錄都可以讀,只要權限允許'''
 +
* /tmp 的權限表是「drwxrwxrwt」,/var/tmp 的權限表是「drwxrwxrwx」,任何人都可以觸及與建檔。最後的字母「t」代表 sticky bit(黏著位),'''即使目錄對所有人都有寫入權限,也不能隨便刪除別人的檔案'''。只有以下三種情況可以刪除檔案:
 +
*#檔案擁有者
 +
*#目錄擁有者
 +
*#root
 +
:其他使用者即使有 w 權限,也不能刪除。
 +
* 將 CSV 檔移到 /tmp 之下,任何 OS 帳號均可進入,但不代表這個 CSV 檔 mysql 可以讀取,要再檢查 CSV 檔的權限表。
 +
* 如果 CSV 檔可以讀取, adminer 就可以成功執行<pre>LOAD DATA INFILE '/tmp/某.csv' INTO TABLE 某表 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (欄名,…);</pre>
  
* 登入 DS720+
+
===用 mysqlimport 資料匯入 CSV===
* 從 DS218+ 將 CSV 檔帶入 DS720+
+
用 mysqlimport 匯入 csv,會更快,但是 mysqlimp 會把檔名當作資料表名。
 +
<!--限區網中操作 ssh 帳號@192.168.4.4 -->
 +
* 登入 DS720+ ,以「sudo -i」取得 root 的操作權限
 +
* 從 DS218+ 將 CSV 檔帶入 DS720+<pre>scp -rp adminNas@192.168.4.2:/volume1/Data/2025post/檔名.csv /tmp</pre> => 回答 adminNas 在 192.168.4.2 中的密碼
 +
* cp -a /tmp/檔名.csv /tmp/資料表名.csv
 
* 以
 
* 以
<pre>/usr/local/mariadb10/bin/mysqlimport --local \\
+
<pre>/usr/local/mariadb10/bin/mysqlimport --local \
--fields-terminated-by=',' \\
+
--fields-terminated-by=',' \
--lines-terminated-by='\r\n' \\
+
--lines-terminated-by='\r\n' \
--ignore-lines=1 \\
+
--ignore-lines=1 \
-u 使用者名 -p 資料庫名 \\
+
-u 使用者名 -p 資料庫名 \
 
/tmp/資料表名.csv</pre>
 
/tmp/資料表名.csv</pre>
回答使用者密碼
+
: => 回答使用者密碼
* 再來一個
+
* 再來下一個 csv
 +
* 萬一出錯以「truncate table 表格名;」清空資料表。
 +
 
 +
===登入 MySQL 後 用 SQL 指令匯入===
 +
# PuTTY 登入 NAS
 +
# 用 mysql client
 +
# 執行 LOAD DATA LOCAL INFILE
 +
 
 +
* 登入 MySQL:mysql -u wiki -p 資料庫名稱
 +
* 使用 SQL 指令:
 +
<pre>LOAD DATA LOCAL INFILE '/volume1/web/勞保局投保資料202506.csv'
 +
INTO TABLE `2025勞保`
 +
FIELDS TERMINATED BY ','
 +
OPTIONALLY ENCLOSED BY '"'
 +
LINES TERMINATED BY '\r\n'
 +
IGNORE 1 LINES
 +
(`保險證號`,`投保單位名稱`,`保費年月(西元年)`,`投保薪資`,`職災投保薪資`,`行業細類`);</pre>
 +
 
 +
===諸 SQL 指令===
 +
::---------- 以 adminer 賦學校 schoolCode(簡稱 scode) ----------
 +
# [[zhtwwikipedia::學校代碼|中華民國教育體系的學校識別碼]]
 +
# 取公保校名:「select DISTINCT 學校名稱 from 2025公保資料;」
 +
# 匯入公保校名得 3,520 校
 +
# 取勞保校名:「select DISTINCT 投保單位名稱 from 2025勞保資料;」
 +
# create table create table 2025勞保校名 like 2025公保校名
 +
# 匯入勞保校名得 3,927 校
 +
# 找丟失的公保校名:「SELECT a.原始校名 from 2025公保校名 a left join 2025勞保校名 b using(原始校名) where b.原始校名 is null」得 416 校
 +
# 新公保對照舊postSchool「SELECT a.原始校名 from 2025公保校名 a left join 2025postSchool b on a.原始校名=b.schoolName where b.schoolName is null」得 271 校
 +
# 填 公保校名 的 scode
 +
#*從過往的檔案抄「update 2025公保校名 a left join 2025postSchool b on a.原始校名=b.schoolName SET a.schoolCode=b.schoolCode where b.schoolName is not null」
 +
#*從教育部編碼抄
 +
#*#抄校名相同者10所國立非大學「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=b.學校名稱 set a.schoolCode=b.schoolCode where a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
#*#抄 102 所縣市立高中,如「新北市立泰山高級中學」,「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(concat(SUBSTRING(縣市名稱,5,2),學校名稱),CHAR_LENGTH(concat(SUBSTRING(縣市名稱,5,2),學校名稱))-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中%'」
 +
#*#抄國立高中「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中' && b.學校名稱 like '國立%' && a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
#*#抄國立女中「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'子高級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '國立%' && b.學校名稱 like '%女中' && a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
# 填 勞保校名 的 scode
 +
#*從過往的檔案抄「update 2025勞保校名 a left join 2025postSchool b on a.原始校名=b.schoolName SET a.schoolCode=b.schoolCode where b.schoolName is not null」
 +
#*從教育部編碼抄
 +
#*#抄國立高中「UPDATE 2025勞保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中' && b.學校名稱 like '國立%' && a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
#*#抄國立女中「UPDATE 2025勞保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'子高級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '國立%' && b.學校名稱 like '%女中' && a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
#*從公保校名抄「UPDATE 2025勞保校名 a left join 2025公保校名 b using(原始校名) set a.schoolCode=b.schoolCode where a.schoolCode=&#39;&#39; && b.schoolCode is not null」
 +
# 請恩濡用人工去補 2025公保校名 中 schoolCode 為空白的學校之 schoolCode
 +
# 找可回收再用的頁「SELECT page_id,page_namespace,page_title,page_len FROM wiki_page WHERE page_namespace!=6 AND page_namespace!=14 ORDER BY page_len LIMIT 50」<br/>---------- 以 MySQL 腳本命令派 scode 給公保資料與勞保資料 ----------
 +
# /usr/local/mariadb10/bin/mysql -u root -p密碼 --database=資料庫名 < 待匯入腳本.sql
 +
#*「UPDATE 2025公保資料 a left join 2025公保校名 b on a.學校名稱=b.原始校名 set a.schoolCode=b.schoolCode where a.schoolCode=&#39;&#39; && b.schoolCode is not null;」
 +
====待批次處理:====
 +
# 台→臺(資料表上沒有「台北市」這種簡寫)
 +
# 當前的資料表沒有「私立」學校
 +
# 資料表上沒有「國立」開頭的學校
 +
# 特殊字或特殊符號,沒被偵測到?(例:苗栗縣通霄鎮明國民小學→啟明;桃園市大園區林國民小學→菓林)
 +
====停辦 / 改制:====
 +
⽤2025的學校代碼對照之前的資料表(2025postSchool),看看有哪些沒有在2025教育部的學校代碼上並找出原因
 +
# 084703 南投縣⽴港源國⼩ => 停辦(2024
 +
# 134664 屏東縣⽴僑智國⼩ => 停辦(2024
 +
# 134607 屏東縣⽴凌雲國⼩ => 停辦(2024
 +
# 134638 屏東縣⽴舊寮國⼩ => 停辦(2024
 +
# 054695 苗栗縣⽴武榮國⼩ => 停辦(2023
 +
# 054648 苗栗縣⽴僑⽂國⼩ => 停辦(2025
 +
# 034631 桃園市⽴後厝國⼩ => 停辦(2024
 +
# 034625 桃園市⽴圳頭國⼩ => 停辦(2024
 +
# 034632 桃園市⽴沙崙國⼩ => 停辦(2024
 +
# 034635 桃園市⼒陳康國⼩ => 停辦(2024
 +
# 124723 ⾼雄市⽴⻄⾨國⼩ => 停辦(2023
 +
# 124724 ⾼雄市⽴景義國⼩ => 停辦(2023
 +
# 124710 ⾼雄市⽴新威國⼩ => 停辦(2025
 +
# 124727 ⾼雄市麗寶⿓國⼩ => 停辦(2023
 +
# 124715 ⾼雄市⽴集來國⼩ => 停辦(2024
 +
# 094710 雲林縣⽴育英國⼩ =>  改制為分校(2025
 +
# 104724 嘉義縣⽴太和國⼩ => 改制為分校
 +
# 104696 嘉義縣⽴⼤湖國⼩ =>  改制為分校(2025
 +
# 074752 彰化縣⽴潭墘國⼩ => 停辦(2023
 +
# 074755 彰化縣⽴⺠靖國⼩ =>  改制為分校(2025
 +
# 114688 台南市⽴⿓⼭國⼩ =>  改制為分校(2025
 +
# 114703 台南市⽴雙春國⼩ => 停辦(2025
 +
# 114544 台南市⽴沙崙國中 => 改制成沙崙國際⾼中(code有換 2025
 +
# 114642 台南市⽴⽟⼭國⼩ => 停辦(2025
 +
# 114641 台南市⽴⻄埔國⼩ => 停辦(2025
 +
# 114730 台南市⽴新橋國⼩ => 停辦(2025
 +
# 164505 澎湖縣⽴志清國中 => 停辦(2025
 +
# 164506 澎湖縣⽴鎮海國中 => 停辦(2024
 +
# 164631 澎湖縣⽴⽵灣國⼩ => 停辦(2024
 +
# 164612 澎湖縣⽴虎井國⼩ => 停辦(2024

於 2026年5月10日 (日) 21:00 的最新修訂


CSV 資料製備

DS720+ 的 adminer 的讀檔測試

  • SHOW VARIABLES LIKE 'secure_file_priv';
    1. 若為情況一:secure_file_priv = NULL 代表 完全禁止 LOAD DATA INFILE
    2. 若為情況二:secure_file_priv = /var/lib/mysql-files/ 代表 只能從這個目錄讀檔
    3. 結果是情況三:secure_file_priv = (空白) 代表 任何目錄都可以讀,只要權限允許
  • /tmp 的權限表是「drwxrwxrwt」,/var/tmp 的權限表是「drwxrwxrwx」,任何人都可以觸及與建檔。最後的字母「t」代表 sticky bit(黏著位),即使目錄對所有人都有寫入權限,也不能隨便刪除別人的檔案。只有以下三種情況可以刪除檔案:
    1. 檔案擁有者
    2. 目錄擁有者
    3. root
其他使用者即使有 w 權限,也不能刪除。
  • 將 CSV 檔移到 /tmp 之下,任何 OS 帳號均可進入,但不代表這個 CSV 檔 mysql 可以讀取,要再檢查 CSV 檔的權限表。
  • 如果 CSV 檔可以讀取, adminer 就可以成功執行
    LOAD DATA INFILE '/tmp/某.csv' INTO TABLE 某表 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (欄名,…);

用 mysqlimport 資料匯入 CSV

用 mysqlimport 匯入 csv,會更快,但是 mysqlimp 會把檔名當作資料表名。

  • 登入 DS720+ ,以「sudo -i」取得 root 的操作權限
  • 從 DS218+ 將 CSV 檔帶入 DS720+
    scp -rp adminNas@192.168.4.2:/volume1/Data/2025post/檔名.csv /tmp
    => 回答 adminNas 在 192.168.4.2 中的密碼
  • cp -a /tmp/檔名.csv /tmp/資料表名.csv
/usr/local/mariadb10/bin/mysqlimport --local \
--fields-terminated-by=',' \
--lines-terminated-by='\r\n' \
--ignore-lines=1 \
-u 使用者名 -p 資料庫名 \
/tmp/資料表名.csv
=> 回答使用者密碼
  • 再來下一個 csv
  • 萬一出錯以「truncate table 表格名;」清空資料表。

登入 MySQL 後 用 SQL 指令匯入

  1. PuTTY 登入 NAS
  2. 用 mysql client
  3. 執行 LOAD DATA LOCAL INFILE
  • 登入 MySQL:mysql -u wiki -p 資料庫名稱
  • 使用 SQL 指令:
LOAD DATA LOCAL INFILE '/volume1/web/勞保局投保資料202506.csv'
INTO TABLE `2025勞保`
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(`保險證號`,`投保單位名稱`,`保費年月(西元年)`,`投保薪資`,`職災投保薪資`,`行業細類`);

諸 SQL 指令

---------- 以 adminer 賦學校 schoolCode(簡稱 scode) ----------
  1. 中華民國教育體系的學校識別碼
  2. 取公保校名:「select DISTINCT 學校名稱 from 2025公保資料;」
  3. 匯入公保校名得 3,520 校
  4. 取勞保校名:「select DISTINCT 投保單位名稱 from 2025勞保資料;」
  5. create table create table 2025勞保校名 like 2025公保校名
  6. 匯入勞保校名得 3,927 校
  7. 找丟失的公保校名:「SELECT a.原始校名 from 2025公保校名 a left join 2025勞保校名 b using(原始校名) where b.原始校名 is null」得 416 校
  8. 新公保對照舊postSchool「SELECT a.原始校名 from 2025公保校名 a left join 2025postSchool b on a.原始校名=b.schoolName where b.schoolName is null」得 271 校
  9. 填 公保校名 的 scode
    • 從過往的檔案抄「update 2025公保校名 a left join 2025postSchool b on a.原始校名=b.schoolName SET a.schoolCode=b.schoolCode where b.schoolName is not null」
    • 從教育部編碼抄
      1. 抄校名相同者10所國立非大學「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=b.學校名稱 set a.schoolCode=b.schoolCode where a.schoolCode='' && b.schoolCode is not null」
      2. 抄 102 所縣市立高中,如「新北市立泰山高級中學」,「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(concat(SUBSTRING(縣市名稱,5,2),學校名稱),CHAR_LENGTH(concat(SUBSTRING(縣市名稱,5,2),學校名稱))-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中%'」
      3. 抄國立高中「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中' && b.學校名稱 like '國立%' && a.schoolCode='' && b.schoolCode is not null」
      4. 抄國立女中「UPDATE 2025公保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'子高級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '國立%' && b.學校名稱 like '%女中' && a.schoolCode='' && b.schoolCode is not null」
  10. 填 勞保校名 的 scode
    • 從過往的檔案抄「update 2025勞保校名 a left join 2025postSchool b on a.原始校名=b.schoolName SET a.schoolCode=b.schoolCode where b.schoolName is not null」
    • 從教育部編碼抄
      1. 抄國立高中「UPDATE 2025勞保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '%高中' && b.學校名稱 like '國立%' && a.schoolCode='' && b.schoolCode is not null」
      2. 抄國立女中「UPDATE 2025勞保校名 a left join 2025學校代碼 b on a.原始校名=concat(LEFT(學校名稱,CHAR_LENGTH(學校名稱)-1),'子高級中學') set a.schoolCode=b.schoolCode where b.學校名稱 like '國立%' && b.學校名稱 like '%女中' && a.schoolCode='' && b.schoolCode is not null」
    • 從公保校名抄「UPDATE 2025勞保校名 a left join 2025公保校名 b using(原始校名) set a.schoolCode=b.schoolCode where a.schoolCode='' && b.schoolCode is not null」
  11. 請恩濡用人工去補 2025公保校名 中 schoolCode 為空白的學校之 schoolCode
  12. 找可回收再用的頁「SELECT page_id,page_namespace,page_title,page_len FROM wiki_page WHERE page_namespace!=6 AND page_namespace!=14 ORDER BY page_len LIMIT 50」
    ---------- 以 MySQL 腳本命令派 scode 給公保資料與勞保資料 ----------
  13. /usr/local/mariadb10/bin/mysql -u root -p密碼 --database=資料庫名 < 待匯入腳本.sql
    • 「UPDATE 2025公保資料 a left join 2025公保校名 b on a.學校名稱=b.原始校名 set a.schoolCode=b.schoolCode where a.schoolCode='' && b.schoolCode is not null;」

待批次處理:

  1. 台→臺(資料表上沒有「台北市」這種簡寫)
  2. 當前的資料表沒有「私立」學校
  3. 資料表上沒有「國立」開頭的學校
  4. 特殊字或特殊符號,沒被偵測到?(例:苗栗縣通霄鎮明國民小學→啟明;桃園市大園區林國民小學→菓林)

停辦 / 改制:

⽤2025的學校代碼對照之前的資料表(2025postSchool),看看有哪些沒有在2025教育部的學校代碼上並找出原因

  1. 084703 南投縣⽴港源國⼩ => 停辦(2024
  2. 134664 屏東縣⽴僑智國⼩ => 停辦(2024
  3. 134607 屏東縣⽴凌雲國⼩ => 停辦(2024
  4. 134638 屏東縣⽴舊寮國⼩ => 停辦(2024
  5. 054695 苗栗縣⽴武榮國⼩ => 停辦(2023
  6. 054648 苗栗縣⽴僑⽂國⼩ => 停辦(2025
  7. 034631 桃園市⽴後厝國⼩ => 停辦(2024
  8. 034625 桃園市⽴圳頭國⼩ => 停辦(2024
  9. 034632 桃園市⽴沙崙國⼩ => 停辦(2024
  10. 034635 桃園市⼒陳康國⼩ => 停辦(2024
  11. 124723 ⾼雄市⽴⻄⾨國⼩ => 停辦(2023
  12. 124724 ⾼雄市⽴景義國⼩ => 停辦(2023
  13. 124710 ⾼雄市⽴新威國⼩ => 停辦(2025
  14. 124727 ⾼雄市麗寶⿓國⼩ => 停辦(2023
  15. 124715 ⾼雄市⽴集來國⼩ => 停辦(2024
  16. 094710 雲林縣⽴育英國⼩ => 改制為分校(2025
  17. 104724 嘉義縣⽴太和國⼩ => 改制為分校
  18. 104696 嘉義縣⽴⼤湖國⼩ => 改制為分校(2025
  19. 074752 彰化縣⽴潭墘國⼩ => 停辦(2023
  20. 074755 彰化縣⽴⺠靖國⼩ => 改制為分校(2025
  21. 114688 台南市⽴⿓⼭國⼩ => 改制為分校(2025
  22. 114703 台南市⽴雙春國⼩ => 停辦(2025
  23. 114544 台南市⽴沙崙國中 => 改制成沙崙國際⾼中(code有換 2025
  24. 114642 台南市⽴⽟⼭國⼩ => 停辦(2025
  25. 114641 台南市⽴⻄埔國⼩ => 停辦(2025
  26. 114730 台南市⽴新橋國⼩ => 停辦(2025
  27. 164505 澎湖縣⽴志清國中 => 停辦(2025
  28. 164506 澎湖縣⽴鎮海國中 => 停辦(2024
  29. 164631 澎湖縣⽴⽵灣國⼩ => 停辦(2024
  30. 164612 澎湖縣⽴虎井國⼩ => 停辦(2024