TSVファイルを用意したい時、みんなどうしてるんだろう?僕の場合


テストデータとかでTSVがほしい時って、みんなどうしてるんだろう?テキストエディタで作るのは正直めんどいよね。
Excelで作る人が多いと思うんだけど、あれって癖があるよね。僕はこうしてるって例を書いてみる。

Excelでデータを貼り付けて、テキストエディタに貼り付けるって方式だと、最後のカラムが空データだった場合に省略されてしまう。
例えばExcelでこんな感じのデータがあったとする。

これ、A1からC3までをコピーしてテキストエディタに貼り付けると、C1、C2、C3のためにタブが入る。
でもこれだと・・・

なぜかC1、C2が無かったことにされる事がある。
※ どういうわけかちゃんと空文字として認識してくれる事もあるみたいなんだけど、条件が解らないからボツ。

じゃあどうするかってーと、僕はこうしてる。
1.Excelのマクロを有効にする。
2.1つブックを作って、データ用シートと、設定用シートを作っておく。
3.設定用シートに、最大列数を書く。名前も定義しておく。生成用マクロを起動するボタンも置いておく。
4.データ用シートにはヘッダ行を作っておくこと。作っておかないと、後で修正する時に解りづらい。

設定用シートの例

データ用シートの例(元データって書いてあるけど、そこはご愛嬌)

あとは、生成用ボタンのイベントに、ソースを書く。

vba
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がもっとちゃんと動いてくれればいいのになあ。