2009年4月17日金曜日

CSVの項目を並び替えるスクリプト

仕事で必要になったので、久々にコードを書くにはちょうどいいかも
と思い、WEBで調べつつ手軽なVBScriptで作成。
(VBScriptってトコがヘナチョコ感満載。でも、WSH使えるなぁ…)

[並び替え前のCSV]  [並び替えた後のCSV]
1番目の項目  --------> 5番目
2番目の項目  --------> 4番目
3番目の項目  --------> 2番目
4番目の項目  --------> 1番目
5番目の項目  --------> 3番目

といった変換をするスクリプトです。
本当に久々にコードを書いたので、
カッコワルサとかその辺は勘弁してください。
ちなみに、これ作るのに2時間もかかりました…
細切れで空いた時間に作ったとはいえ、萎える…orz


-------------------------------------------

'---------------------------------------------------------------
' CSV変換スクリプト
'---------------------------------------------------------------

Option Explicit

' 引数(ドラッグアンドドロップしたファイル名)を取得
Dim objArgs
Set objArgs = WScript.Arguments

Dim strFileName

If objArgs.Count = 0 Then
strFileName = InputBox("変換したい CSV のファイル名をフルパスで入力してください。")
Else
strFileName = objArgs(0)
End If

'ファイル名が入力されなかったら終了
If strFileName = "" Then
WScript.Quit
End If

Dim objFS

'定数の定義
Const ForReading = 1,ForWriting = 2,ForAppending = 8
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Dim objFileInput
Dim objFileOutput

Set objFileInput = objFS.OpenTextFile(strFileName, ForReading)
Set objFileOutput = objFS.CreateTextFile(strFileName & ".convert.csv", True)

Dim aryDestCols(4)
Dim strLine
Dim arySrcCols
Dim strCol

'ヘッダを書き出す場合はここで。
objFileOutput.Write _
"""1カラム目"",""2カラム目"",""さ~んカラム目""" & vbCrLf


Do Until objFileInput.AtEndOfStream
'変換元CSVを1行読み込む
strLine = objFileInput.ReadLine
'項目ごとに分解する
arySrcCols = Split(strLine, ",")

'マッピング通りに入れ替え
aryDestCols(0) = arySrcCols(3)
aryDestCols(1) = arySrcCols(2)
aryDestCols(2) = arySrcCols(4)
aryDestCols(3) = arySrcCols(1)
aryDestCols(4) = arySrcCols(0)

objFileOutput.Write Join(aryDestCols, ",") & vbCrLf
Loop

objFileOutput.Close
objFileInput.Close

2 件のコメント:

匿名 さんのコメント...

柏様

記事の内容、とても参考になりました。
メールソフトのアドレス帳を新システムへ移行する際、CSVの列並び替えを容易にするツールを探しておりました。よろしければ、職場の方にも紹介して利用させていただきたいと思っておりますがいかがでしょうか...

Takamitsu Kashiwa さんのコメント...

コメントありがとうございます!
私自身、懐かしくこの記事を振り返り「もっとコード部分を見やすく整形しておけば良かった…」と思いましたが^^;、ご参考いただけたようで幸いです。
もちろん、 公開している内容ですのでご自由に活用ください!