今、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)
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
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
ありがとうございます!上手くいきました!活用させて頂きます!
EXCELじゃないですが、awk だったらこんなカンジです。
awk自体はhttp://www.vector.co.jp/soft/dos/util/se000208.htmlあたりからダウンロードできます。
awk -F"," '{print > ( $101 ".csv" )}' INPUT_FILE.csv
ありがとうございます!上手くいきました!活用させて頂きます!
ありがとうございます!上手くいきました!活用させて頂きます!