番号、文字列1、文字列2、、、文字列N というフィールドで1レコード(行)作られているCSVファイルを1レコード(行)毎にバラバラにし、番号.txt というファイルにする簡単な(早い)方法を教えてください。Windows XP上で作業可能な方法でお願いします。Excelは持ってます。

回答の条件
  • 1人2回まで
  • 登録:2006/04/07 18:19:11
  • 終了:2006/04/07 19:33:42

回答(2件)

id:Kenju No.1

Kenju回答回数30ベストアンサー獲得回数22006/04/07 19:00:34

ポイント68pt

プログラムでやってしまえば、どれでも同じですが。

やっぱりExcelマクロが早いですかね。

hozonDir は保存先です。\マークを忘れずに。

列の連結は間になにもはさんでないのでくっついて出てきますが、必要なら

fpbuf = fpbuf & txtSheet.Cells(txtRow, txtCol).Value

この&の間に文字をいれてやればいいです。

使用方法は、CSVをエクセルで開いてAlt + F11でSheet1っていうのが右にあると思うのでそれをダブルクリック。

以下を貼りつけ、「|>」三角のマークを押します。

Sub main()

 Const hozonDir = "C:\"

 Dim txtRow As Long

 Dim txtCol As Integer

 Dim txtRowEnd As Long

 Dim txtColEnd As Integer

 Dim txtSheet As Object

 Dim writeFile As Integer

 Dim fpbuf As String

 Set txtSheet = ThisWorkbook.Worksheets(1)

'最終行を算出

 With txtSheet

  txtRowEnd = .Cells(.Rows.Count, 1).End(xlUp).Row

  txtColEnd = .Cells(1, .Columns.Count).End(xlToLeft).Column

 End With

'行が終わるまで繰り返す

 For txtRow = 1 To txtRowEnd Step 1

 'ファイルを開く

  writeFile = FreeFile

  Open hozonDir & txtSheet.Cells(txtRow, 1).Value & ".txt" For Output As #writeFile

  fpbuf = ""

 '最終列を算出

  With txtSheet

   txtColEnd = .Cells(1, .Columns.Count).End(xlToLeft).Column

  End With

 '列を1行単位で連結

  For txtCol = 2 To txtColEnd Step 1

   fpbuf = fpbuf & txtSheet.Cells(txtRow, txtCol).Value

  Next

  Print #writeFile, fpbuf

 'ファイルを閉じる

  Close #writeFile

 Next

 MsgBox "実行終了"

End Sub

id:adan

ありがとうございました。

2006/04/07 19:25:51
id:Nanja No.2

Nanja回答回数213ベストアンサー獲得回数42006/04/07 19:04:08

ポイント2pt

下記のようにするのが手っ取り早いかと思います。

1.CSVファイルをExcelで開く

2.値のあるセルをすべて選択

3.別のセルへ形式を選択して貼り付け

  このとき、行/列を入れ替えのチェックをオンにする

4.名前をつけて保存

  ファイル形式をテキスト(タブ区切り)にする

いかがでしょうか?

  • id:n_koji72
    bashを使えば数行で出来ます。

    1.windowsなら,あらかじめcygwinをインストールします。

    2.テキストエディタで以下の内容のファイルを作成し
    適当な名前(split_file.sh)で入力ファイルと同じフォルダに保存

    #!/bin/bash
    split -l1 $1
    k=1
    for i in $(ls x*)
    mv $i $k.txt
    k=$((k + 1))
    done

    3. cygwinのプロンプトを起動し,入力ファイルのあるフォルダに移動して

    $ sh ./split_file.sh (csvファイル名)

    でおしまい。

    詳しくはこの辺を
    http://sohda.net/cygwin/
    http://www.linuxworld.jp/command/-/10684.html

    マクロも良いですが,単純な繰り返し処理はコマンドラインが圧倒的にラクだと思います。
  • id:n_koji72
    さっきのスクリプト

    #!/bin/bash
    split -l1 $1
    k=1
    for i in $(ls x*)
    do          ←ここが抜けてました
    mv $i $k.txt
    k=$((k + 1))
    done
  • id:Kenju
    マジで?
    勉強になった。ちょっと調べてみゆ。

    自分のマクロも
    txtColEnd = .Cells(1, .Columns.Count).End(xlToLeft).Column が
    txtColEnd = .Cells(txtRow, .Columns.Count).End(xlToLeft).Column
    ですた。。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません