テストデータとかでTSVがほしい時って、みんなどうしてるんだろう?テキストエディタで作るのは正直めんどいよね。
Excelで作る人が多いと思うんだけど、あれって癖があるよね。僕はこうしてるって例を書いてみる。
Excelでデータを貼り付けて、テキストエディタに貼り付けるって方式だと、最後のカラムが空データだった場合に省略されてしまう。
例えばExcelでこんな感じのデータがあったとする。
これ、A1からC3までをコピーしてテキストエディタに貼り付けると、C1、C2、C3のためにタブが入る。
でもこれだと・・・
なぜかC1、C2が無かったことにされる事がある。
※ どういうわけかちゃんと空文字として認識してくれる事もあるみたいなんだけど、条件が解らないからボツ。
じゃあどうするかってーと、僕はこうしてる。
1.Excelのマクロを有効にする。
2.1つブックを作って、データ用シートと、設定用シートを作っておく。
3.設定用シートに、最大列数を書く。名前も定義しておく。生成用マクロを起動するボタンも置いておく。
4.データ用シートにはヘッダ行を作っておくこと。作っておかないと、後で修正する時に解りづらい。
設定用シートの例
データ用シートの例(元データって書いてあるけど、そこはご愛嬌)
あとは、生成用ボタンのイベントに、ソースを書く。
Sub 生成ボタン_click()
'最大列数を取得
Dim maxColumn As Long
maxColumn = Range("最大列数").Value
'ファイルを生成
Dim dir As String
dir = curDir & "\"
Dim filePath As String
Dim fileName As String
fileName = Format(Now, "yyyymmddhhnnss") & ".tsv"
filePath = curDir & "\" & fileName
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject") 'ちなみにデフォルトだとSJISで出力するよ。
Dim textFile As Object
Set textFile = FSO.OpenTextFile(filePath, 2, True)
'元データの最初の位置へ
Dim startRng As Range
Set startRng = Range("元データのヘッダ1列目")
startRng.Worksheet.Select
startRng.Activate
'ヘッダを1行目とする。次の行があるならばループする
Do While (Not ActiveCell.Offset(1, 0).Value = "") '次の行にデータがあるならば、次の行に移る
ActiveCell.Offset(1, 0).Activate
Dim i As Integer
'カラム数だけ読み取る
For i = 0 To maxColumn - 1
textFile.Write ActiveCell.Offset(0, i).Value
'最後の列でなければ、タブ文字を入れる
If Not i >= maxColumn - 1 Then
textFile.Write vbTab
End If
Next i
'1行の出力が終わったので、改行する
textFile.WriteBlankLines 1
Loop
textFile.Close
MsgBox "このExcelのブックと同じ場所に、tsvファイルを作成しました。ファイル名:" & fileName
End Sub
これで、生成ボタンを押せば、ブックと同じ場所にTSVファイルが生成される。
データの入力の時「00001」のように、先頭に0がある数字を入れる場合は、「'00001」のようにシングルクオートを入れておくと、0が省略されない。この時のシングルクオートはTSVファイルに出力されない。
こんな感じでTSVファイルを作ってます。
書いた僕がいうのもなんだけど、面倒だよなあ。Excelがもっとちゃんと動いてくれればいいのになあ。