WindowsバッチファイルでCSVを読み込む
forのオプションであるtokensを使ってCSVを読み込むサンプルは検索するとたくさん出てくるけれど,tokens=1,2,…だとASCII文字(A-Z,a-z)の数だけしか列データを読み込めない.
なので,たくさん列データを読めるようなバッチを書いた.
(ついでに先頭行はヘッダとして読むことに)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
@echo off setlocal enabledelayedexpansion set CSVFILE=%~dp0test.csv rem =========================== rem Load CSV file rem =========================== :load_csv set COL_INDEX= set CSVTITLE= set CSVDATA= set IS_TITLE=TRUE set ROWNUM=0 for /f "eol=# delims=" %%A in (%CSVFILE%) do ( rem echo call :read_csv_line "%%A" call :read_csv_line "%%A" set COLSIZE=!COLNUM! for /l %%n in (0,1,!COLSIZE!) do ( if defined IS_TITLE ( set TMP=!CSVLINE[%%n]! set CSVTITLE[%%n]=!TMP! set COL_INDEX[!TMP!]=%%n ) else ( set CSVDATA[!ROWNUM!][%%n]=!CSVLINE[%%n]! ) ) if defined IS_TITLE set IS_TITLE= set /a ROWNUM+=1 ) set /a ROWSIZE=!ROWNUM!-1 set /a COLSIZE=!COLNUM! rem =========================== rem Display CSV data rem =========================== echo CSV Data Size [%ROWSIZE% x %COLSIZE%] echo. for /l %%r in (1,1,!ROWSIZE!) do ( for /l %%c in (0,1,!COLSIZE!) do ( set TITLE=!CSVTITLE[%%c]! set DATA=!CSVDATA[%%r][%%c]! echo Data %%r: !TITLE! = !DATA! ) ) goto end rem =========================== rem Read CSV line rem =========================== :read_csv_line set LINE=%1 rem echo call :read_csv_inner 0 %LINE% call :read_csv_inner 0 %LINE% goto :EOF :read_csv_inner set NUM=%1 set LINE=%2 for /f "delims=, tokens=1,*" %%A in (!LINE!) do ( set DATA=%%A set REST="%%B" set CSVLINE[!NUM!]=!DATA! rem echo ROW: !ROWNUM! COL: !NUM! DATA: !DATA! REST: !REST! if not !REST!=="" ( set /a NUM+=1 call :read_csv_inner !NUM! !REST! ) ) set COLNUM=!NUM! goto :EOF :end pause endlocal rem Copyright (c) 2016 @tanitanin rem This software is released under the MIT License. rem http://opensource.org/licenses/mit-license.php |
ディスカッション
コメント一覧
まだ、コメントがありません