CSVファイルの分割についてよい方法がありましたらご提案をお願いします。


今、Excelで該当のCSVファイルを開いたとするとCW列に相当する箇所に、
整数の1から81までいずれかが入っています。
※空白のセルはありません
※52が59が存在しないなど、欠番はあり得ます

このようなCSVファイルを、このCW列の数値によってファイルを分割したい
と考えています。例えば
CW列が1であるCSVファイル(ファイル名:1.csv)
CW列が2であるCSVファイル(ファイル名:2.csv)
・・・
CW列が81であるCSVファイル(ファイル名:81.csv)
のような感じです。1つのCSVファイルが最大で81分割されるようなイメージです。

できるだけ簡易に分割できる方法をご教授頂ければ幸いです。
どうぞよろしくお願い致します。

※CSVファイルのレコード数は任意であり、だいたい1~50万です
※CSVファイルのカラムはA列からCW列まですきまなくデータが存在します
※ExcelのVBAを用いた方法でも構いません(Excel2007でもOK)

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2011/06/10 14:38:34
  • 終了:2011/06/11 15:13:33

回答(3件)

id:nattow No.1

nattow回答回数102ベストアンサー獲得回数272011/06/10 17:58:41

ポイント40pt

VBA で分割。

Excel2003 で確認しています。

Sub exec()
    Dim i,j,k As Integer
    Dim s As String
    
    For i = 1 To 81
        j = 1
        Open CStr(i) & ".csv" For Output As #1
        Do While Cells(j, 1) <> ""
            If Cells(j, 101) = i Then
                s = ""
                For k = 1 To 100
                    s = s & Cells(j, k) & ","
                Next k
                Print #1, s & Cells(j, 101)
            End If
            j = j + 1
        Loop
        Close #1
    Next i
End Sub
id:miku1973

ありがとうございます!上手くいきました!活用させて頂きます!

2011/06/11 15:12:33
id:TransFreeBSD No.2

TransFreeBSD回答回数668ベストアンサー獲得回数2682011/06/10 18:55:50

ポイント40pt

wshで書いたので貼っておきます。

使い方は、メモ帳か何かで下記をコピペして、最初の行のファイル名(今はall.csvになってる)を対象のcsvファイルの名前に変えて、csvファイルと同じフォルダに、(好きな名前).vbsという名前で保存。あとは保存したファイルをダブルクリックするだけです。

やってる事はnattowさんとだいたい一緒で、違うのは行末が",1"、",2"で終わってるかどうかで判定してるところです。

Const inputFileName = "all.csv"
Const endOfNumber = 81

Dim fso, sh, ifile, i
Set fso = CreateObject("Scripting.FileSystemObject")
Set sh = CreateObject("WScript.Shell")
Set ifile = fso.GetFile(sh.CurrentDirectory & "\" & inputFileName)

For i = 1 To endOfNumber
    Dim re, itsm, ots
    Set its = ifile.OpenAsTextStream(1) ' ForReading
    Set ots = fso.CreateTextFile(i & ".csv", True)
    Set re = New RegExp
    re.Pattern = "," & i & "$"
    While Not its.AtEndOfStream
        Dim l
        l = its.ReadLine()
        If re.Test(l) Then
            ots.WriteLine(l)
        End If
    Wend
    ots.Close
    its.Close
Next
id:miku1973

ありがとうございます!上手くいきました!活用させて頂きます!

2011/06/11 15:12:40
id:elephant1974 No.3

elephant1974回答回数1ベストアンサー獲得回数02011/06/11 04:52:38

ポイント20pt

EXCELじゃないですが、awk だったらこんなカンジです。

awk自体はhttp://www.vector.co.jp/soft/dos/util/se000208.htmlあたりからダウンロードできます。

 awk -F"," '{print > ( $101 ".csv" )}' INPUT_FILE.csv
  • 「INPUT_FILE.csv」は入力ファイル名です。適当に変更してください。
  • 「$101」というのはCW列が101個目の列と言う意味です。(C列なら「$3」となる)
id:miku1973

ありがとうございます!上手くいきました!活用させて頂きます!

2011/06/11 15:12:46
  • id:TransFreeBSD
    - データはCW列までしかありませんか?(つまりcsvで改行の直前がCW列の数字ですか?)
    - 1行目も同じ形式ですか?(タイトルではなくデータですか?)
    - CW列以外にも数値のカラムはありますか?
    - Windows以外のOS(linuxかMacOSX)は使えませんか?
    Windows以外でCW列が必ず最後なら
    for i in `seq 1 1 100`; do ( grep $i\\n hoge.csv > $i.csv ) ; done
    みたいな感じで行けると思う。ちょっと自信ないけど。
  • id:miku1973
    データはCW列が最終で、それ以降はありません。
    1行目も同じ形式です。タイトルではありません。
    CW列以外にも数値のカラムはあります。A列からCW列まで数値や文字列がびっしり入っています。
    Windows環境しかありません。
     
    いろいろすいません。
    どうぞよろしくお願い致します。

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

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

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

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