2011年4月25日月曜日

◆CSVファイルをExcelで開く

拡張子CSVはデフォルトではExcelに関連付けられている。(当然Excelが入っていればだが)
カラム毎に表示されるのでメモ帳で開くよりは見やすい。
ただし、CSVファイルをダブルクリックして開いた場合はデータの内容に応じてExcelが自動的にフォーマットしてくれるのだが、これが大きなお世話になることもある。

例えば、以下のようなCSVファイルを開くと、こんな感じになってしまう。

"00001","1-1",1,-66
"00003","2-1",3,4


image

これを回避するにはテキストとしてインポートして、その時に表示されるウィザードにてカラムの属性をそれぞれ指定してあげれば良い。
毎回同じフォーマットのCSVを開くのであればこれをマクロ登録しておけば良いのだが、フォーマットの違うCSVを開く場合はその都度カラム属性の指定が必要になる。

そこで、とりあえずフォーマット変更されないようにすべての項目に対して文字列属性を指定してExcelで開くスクリプトを作ってみた。

001
002
003
004
005
006
007
008
009
010
011
012

$path = $args[0]
$itemCount = ((Get-Content $path -TotalCount 1) -split ",").Count
$excel = New-Object -Com Excel.Application
$excelBook = $excel.Workbooks.Add()
$excel.Visible = 
$true
$query
 = $excel.ActiveSheet.QueryTables.Add(
"TEXT;$path",$excel.Application.Range('$A$1'))
$query.TextFileCommaDelimiter = 
$true
$arr
 = [char[]]("2" * $itemCount) | %{[int]::Parse($_)}

$query.TextFileColumnDataTypes = 
$arr
$query
.Refresh($false) | Out-Null

結果はこんな感じになる。
image

純粋な数値項目も左寄せになってしまい今一歩感もあるが、とりあえずさっきよりはましではなかろうか。

ちなみに、属性の指定はカラムの数分だけ配列で指定すれば良さそうだ。
ここでは「文字列属性」ということで2を指定している。

またCSVの拡張子に関連付けるには、このスクリプトを呼び出すバッチファイルを作る必要がありそうだ。(ps1ファイルは実行形式として扱われていないため)

0 件のコメント:

コメントを投稿