お世話になります。複数の連番テキストファイルの処理方法にて教えていただきたいです。
現在スペース区切りのテキストファイルで1番から~最終番まで連番で名前が付けられたファイルがあります。(data1.txt data2.txt data3.txt・・・・・data1000.txt…場合によってはdata10000.txtぐらいまで)
そのファイルの中身は、data1.txtを開くと
1 dataA dataB dataC dataD dataE ・・・ data
2 dataA dataB dataC dataD dataE ・・・ data
1000000 dataA dataB dataC dataD dataE ・・・ data
といった具合に行列形式にて格納される形となっております。実験区の数(列数)は不定であり、そのデータの行数は不定でありますが、全部のtxtファイルに同じ行数および同じ列数で入っております。(ファイル間でのデータの抜けはありません)
今回やりたい事は、エクセルに指定した列のデータを連番順に列に張り付けたいという事です。最終的処理したいデータはエクセル上に展開してグラフを作成するため、できればVBAを使い行えればと思っております。
例えば、二列目のデータのみをエクセルに抽出しろという指示を出すと
A列には必ずdata1.txtの1列目を張り付けて、B列にはdata1.txtの2列目を張り付けて、C列にはdata2.txtの2列目を張り付けて、D列にはdata3.txtの2列目を張り付けてといった具合です。
エクセルにこだわる理由としては、使用するコンピュータのデータは持ちだすことは出来ず、新規ソフトのインストールも禁止のPCであるためエクセル2010内にあるVBAしかプログラム作成ツールがないからです。(cmdはユーザーからは使えないように設定されています。)
現在は年内中にどうにかしなければならないために手作業で展開して張り付けてるのですが、いかんせんファイルも大きく、はかどっていないのが現状です。
当方、エクセル内に展開したデータの抽出などに関してのVBAは組めるのですが、外部データ参照した経験が無く、作成方法が思いつきませんでした。勉強しておけばと後悔中です。
今回は一応100万行以内に収まっているためいきなりエクセルが対応できると思うのですが、今後200万行を超えてくるのが確定しているため、上記でエクセルに展開というところは直接新規テキストファイルに並べるという方がありがたいですが、こちらは可能なのでしょうか?(その集計ファイルの名前は任意でつけれるともっと嬉しいです)
わがままなお願いなのはわかっておりますが、受け入れてくださるとありがたいです。
No.12ベストアンサー
- 回答日時:
No11の改善版です。
No11で大きなファイルを読み込んだとき、思ったより時間がかかったので、見なおしました。4倍ほど速くなっています。
-----------------------------------------------------
1:# coding:WINDOWS-31J
2:#
3:def main()
4: if ARGV.size != 5
5: spname = $0.sub(/^.*\//,"")
6: print "#{spname} P1 P2 P3 P4 P5\n"
7: print "P1:データファイル格納フォルダ\n"
8: print "P2:最小データファイル番号\n"
9: print "P3:最大データファイル番号\n"
10: print "P4:抽出列番号\n"
11: print "P5:作成ファイル名\n"
12: exit 10
13: end
14: dataDir = ARGV.shift
15: minFileNo = (ARGV.shift).to_i
16: maxFileNo = (ARGV.shift).to_i
17: trgColNo = (ARGV.shift).to_i
18: outFile = ARGV.shift
19: if File.directory?(dataDir) == false
20: print "#{dataDir} は存在しません\n"
21: exit 10
22: end
23: if minFileNo < 1
24: print "最小データファイル番号不正\n"
25: exit 10
26: end
27: if maxFileNo < 1
28: print "最大データファイル番号不正\n"
29: exit 10
30: end
31: if minFileNo > maxFileNo
32: print "最小データファイル番号が最大データファイル番号より大きい\n"
33: exit 10
34: end
35: if trgColNo < 2
36: print "抽出列番号不正\n"
37: exit 10
38: end
39: $lines = Array.new
40: t1 = Time.now
41: #ファイル読み込み
42: (minFileNo..maxFileNo).each do |fno|
43: dt1 = Time.now
44: if readFile(dataDir,fno,trgColNo,minFileNo) == false
45: exit 10
46: end
47: dt2 = Time.now
48: print "ファイルNo.#{fno} 読込完了 時間(秒)=#{dt2-dt1}\n"
49: end
50: #ファイル出力
51: ofname = dataDir + "/" + outFile
52: File.open(ofname,"w"){|fs|
53: (0...$lines.size).each do |i|
54: fs.print $lines[i],"\n"
55: end
56: }
57: t2 = Time.now
58: print "処理完了 所要時間(秒)=#{t2-t1}\n"
59:end
60:#ファイル読み込み
61:def readFile(datadir,fno,col,stno)
62: fname = datadir + "/" + "data" + fno.to_s + ".txt"
63: if File.exist?(fname) == false
64: print "#{fname} は存在しません\n"
65: return false
66: end
67: File.open(fname,"r"){ |fs|
68: lno = 0
69: while line = fs.gets
70: elm = line.split(nil)
71: if fno == stno
72: $lines[lno] = elm[0]
73: end
74: $lines[lno] += " " + elm[col-1]
75: lno += 1
76: end
77: }
78:end
79:main()
--------------------------------------------------
もし、既にNo11を使われている場合は、
以下の2か所を修正してください。
1)67行相当の以下の箇所
変更前
File.open(fname,"rt"){ |fs|
変更後
File.open(fname,"r"){ |fs|
2)70行相当の以下の箇所
変更前
elm = line.split(/\s+/)
変更後
elm = line.split(nil)
---------------------------------------
ちなみにVBAとの処理時間の比較ですが、こちらの環境では
180Mバイト(150万行)の1つのファイルを読み込むとき、
VBA:16~17秒
ruby改善版:5~6秒
となっています。
rubyのほうが約2~3倍速いです。
ruby版を使用したほうが、効率は良いと考えます。
No.11
- 回答日時:
ruby版で最小ファイル番号を指定可能にしました。
-----------------------------------------
# coding:WINDOWS-31J
#
def main()
if ARGV.size != 5
spname = $0.sub(/^.*\//,"")
print "#{spname} P1 P2 P3 P4 P5\n"
print "P1:データファイル格納フォルダ\n"
print "P2:最小データファイル番号\n"
print "P3:最大データファイル番号\n"
print "P4:抽出列番号\n"
print "P5:作成ファイル名\n"
exit 10
end
dataDir = ARGV.shift
minFileNo = (ARGV.shift).to_i
maxFileNo = (ARGV.shift).to_i
trgColNo = (ARGV.shift).to_i
outFile = ARGV.shift
if File.directory?(dataDir) == false
print "#{dataDir} は存在しません\n"
exit 10
end
if minFileNo < 1
print "最小データファイル番号不正\n"
exit 10
end
if maxFileNo < 1
print "最大データファイル番号不正\n"
exit 10
end
if minFileNo > maxFileNo
print "最小データファイル番号が最大データファイル番号より大きい\n"
exit 10
end
if trgColNo < 2
print "抽出列番号不正\n"
exit 10
end
$lines = Array.new
t1 = Time.now
prev_t = t1
#ファイル読み込み
(minFileNo..maxFileNo).each do |fno|
if readFile(dataDir,fno,trgColNo,minFileNo) == false
exit 10
end
now_t = Time.now
print "ファイルNo.#{fno} 読込完了 時間(秒)=#{now_t-prev_t}\n"
prev_t = now_t
end
#ファイル出力
ofname = dataDir + "/" + outFile
File.open(ofname,"w"){|fs|
(0...$lines.size).each do |i|
fs.print $lines[i],"\n"
end
}
t2 = Time.now
print "処理完了 所要時間(秒)=#{t2-t1}\n"
end
#ファイル読み込み
def readFile(datadir,fno,col,stno)
fname = datadir + "/" + "data" + fno.to_s + ".txt"
if File.exist?(fname) == false
print "#{fname} は存在しません\n"
return false
end
File.open(fname,"rt"){ |fs|
lno = 0
while line = fs.gets
elm = line.split(/\s+/)
if fno == stno
$lines[lno] = elm[0]
end
$lines[lno] += " " + elm[col-1]
lno += 1
end
}
end
main()
-------------------------------------
これをsample2.rbとして
ruby sample2.rb と入力すると下記Usageが表示されます。
sample2.rb P1 P2 P3 P4 P5
P1:データファイル格納フォルダ
P2:最小データファイル番号
P3:最大データファイル番号
P4:抽出列番号
P5:作成ファイル名
usageに従って、パラメータを入力してください。
No.10
- 回答日時:
>上記のとおり修正したのちは、最小ファイルナンバーの指定は、必要なのでしょうか?
>必要ならば、私が前回質問したような形でminfileNoを設定しておけばよいのでしょうか?
はい、以下の作業が行われた前提に対する回答です。
>Dim minffileNo As Long '最小データファイル番号
>を追加してE2セルに最小ファイル番号を入力するようにして、
>minfileNo=CLng(sh.Cells(2, "E").Value)
>を追加しました。
>そしてFor i = 1 To maxfileNo部分を
>For i = minfileNo To maxfileNo
>に書き直して
従って、実行時は、必ず、E2に最小ファイル番号を設定しておいてください。
出来れば、以下のチェックも行っておいたほうが、運用上間違いが無いでしょう。
1)最小ファイル番号が1未満ならエラー
2)最小ファイル番号>最大ファイル番号ならエラー
No.9
- 回答日時:
>さらに解析機はネットワークにつながっていないPCなので手打ちで入力しているため、回答が遅くなり申し訳ありません
そのような事情であれば、どうぞゆっくりと返信ください。
なお、ruby版でも開始ファイル番号の指定を行うようにしたい場合は、その旨、補足ください。
開始ファイル番号で指定されたファイルのみ、1列目と指定列目のデータを抽出するようにします。
重ね重ねお世話になり、ありがとうございます。
巨大なファイルになるというのがわかってきたため、ruby番でも開始ファイル指定ができればありがたいです。
当初、ファイルサイズを全く気にしていたかったことが恥ずかしいです。
No.8
- 回答日時:
>最小ファイル番号と最大ファイル番号で制御する場合、どのようにしたら良かったのでしょうか?
例えば、最小ファイル番号=7としたとき、
data7.txt~data○○.txtまで処理しますが(○○は最大ファイル番号)
data7.txtは、
「1列目のデータと指定された列のデータを抽出する」ということで良いのですか。
そうであれば、readFileに開始番号が何番かを判らせる必要があります。
readFileを以下のようにします。
Private Function readFile(ByVal datadir As String, ByVal fno As Long, ByVal col As Long, ByVal stno As Long) As Boolean
If fno = 1 Then
'最初のファイルのみ、1番目の列を設定
lines(lno) = data(0)
End If
を
If fno = stno Then
'最初のファイルのみ、1番目の列を設定
lines(lno) = data(0)
End If
のようにします。
(If fno = 1 Then をIf fno = stno Thenに変えます)
呼び出し側は、
If readFile(datadir, i, trgColNo) = False Then Exit Sub
を
If readFile(datadir, i, trgColNo,minfileNo) = False Then Exit Sub
に変えてください。
>data7.txtは、
>1列目のデータと指定された列のデータを抽出する」ということで良いのですか。
そういう意味でございます。
お早いお答えありがとうございます。
現在まだ停電中で(本日復旧は不可能とのこと)作業が行えませんが、質問させてください。
上記のとおり修正したのちは、最小ファイルナンバーの指定は、必要なのでしょうか?必要ならば、私が前回質問したような形でminfileNoを設定しておけばよいのでしょうか?
No.7
- 回答日時:
ruby 2.0であれば、以下のスクリプトが動作するはずです。
------------------------------------------------
# coding:WINDOWS-31J
#
def main()
if ARGV.size != 4
spname = $0.sub(/^.*\//,"")
print "#{spname} P1 P2 P3 P4\n"
print "P1:データファイル格納フォルダ\n"
print "P2:最大データファイル番号\n"
print "P3:抽出列番号\n"
print "P4:作成ファイル名\n"
exit 10
end
dataDir = ARGV.shift
maxFileNo = (ARGV.shift).to_i
trgColNo = (ARGV.shift).to_i
outFile = ARGV.shift
if File.directory?(dataDir) == false
print "#{dataDir} は存在しません\n"
exit 10
end
if maxFileNo < 1
print "最大データファイル番号不正\n"
end
if trgColNo < 2
print "抽出列番号不正\n"
end
$lines = Array.new
t1 = Time.now
#ファイル読み込み
(1..maxFileNo).each do |fno|
if readFile(dataDir,fno,trgColNo) == false
exit 10
end
end
#ファイル出力
ofname = dataDir + "/" + outFile
File.open(ofname,"w"){|fs|
(0...$lines.size).each do |i|
fs.print $lines[i],"\n"
end
}
t2 = Time.now
print "処理完了 所要時間(秒)=#{t2-t1}\n"
end
#ファイル読み込み
def readFile(datadir,fno,col)
fname = datadir + "/" + "data" + fno.to_s + ".txt"
if File.exist?(fname) == false
print "#{fname} は存在しません\n"
return false
end
File.open(fname,"rt"){ |fs|
lno = 0
while line = fs.gets
elm = line.split(/\s+/)
if fno == 1
$lines[lno] = elm[0]
end
$lines[lno] += " " + elm[col-1]
lno += 1
end
}
end
main()
--------------------------------------------
このスクリプトを適当なファイル名で保存してください。(sample.rb)とします。
コマンドプロンプトで、その保存したディレクトリに移動し
ruby sample.rb
と入力すると、
sample.rb P1 P2 P3 P4
P1:データファイル格納フォルダ
P2:最大データファイル番号
P3:抽出列番号
P4:作成ファイル名
のようにUsageが表示されます。
(rubyはパスが通っていることが前提です)
ruby sample.rb d:\goo\data 3 3 outfile.txt
のように入力すると、VBAと同様に処理を行い、outfile.txtへ結果を
出力します。
VBAと違って、ファイルサイズの制限はありません。
メモリの許す限り巨大なファイルも扱えます。
少しずつファイルサイズを大きくして、確認してください。
ありがとうございます。現在、建屋が不測の事態で全館停電となってしまい作業ができなくなってしまいました。現在は手元の携帯端末からアクセスしております。
年内にどうにかしなければならない分は先ほどのVBAを使用させていただきましたので一安心しております。
復旧後(めどが立っていないので本日できるかはわかりません)、状態チェックが終了したのちにご報告させていただきます。
(さらに解析機はネットワークにつながっていないPCなので手打ちで入力しているため、回答が遅くなり申し訳ありません)
No.6
- 回答日時:
>cmdはwinキー+Rを押して、ファイル名指定からの実行では起動しないようにされているという状態です。
ということは、コマンドプロンプトは使用できますね。
コマンドプロンプトで
ruby -v
と入力すると以下のようなバージョンが表示されます。
ruby 2.3.1p112 (2016-04-26 revision 54768) [i386-mingw32]
rubyのバージョンは、いくつでしょうか?
1.8以下だと、まずいですが、1.9以上なら問題ありません。
No.5
- 回答日時:
以下のソースは、ファイルサイズが小さい前提でしか動作しませんが、
あなたの要件を実現するVBAのサンプルです。
---------------------------------------------------------
Option Explicit
Dim lines() As String 'データ
Dim maxlineNo '最大行番号
Public Sub データファイル作成()
Dim datadir As String 'データファイル格納フォルダ
Dim maxfileNo As Long '最大データファイル番号
Dim trgColNo As Long '抽出列番号
Dim filename As String '作成ファイル名
Dim i As Long
Dim sh As Worksheet
Dim stime As Date
Dim etime As Date
If MsgBox("データファイルを作成します", vbOKCancel) = vbCancel Then Exit Sub
Set sh = Worksheets("データ管理")
datadir = sh.Cells(1, "B").Value
maxfileNo = CLng(sh.Cells(2, "B").Value)
trgColNo = CLng(sh.Cells(3, "B").Value)
filename = sh.Cells(4, "B").Value
If dir(datadir, vbDirectory) = "" Then
MsgBox (datadir & "は存在しません。")
Exit Sub
End If
If maxfileNo < 1 Then
MsgBox ("最大データファイル番号不正")
Exit Sub
End If
If trgColNo < 2 Then
MsgBox ("抽出列番号不正")
Exit Sub
End If
stime = Time
maxlineNo = 0
For i = 1 To maxfileNo
If readFile(datadir, i, trgColNo) = False Then Exit Sub
Next
If writeFile(datadir, filename) = False Then Exit Sub
etime = Time
MsgBox (filename & "作成完了。所要時間(秒)=" & Second(etime - stime))
End Sub
'データファイル読み込み
Private Function readFile(ByVal datadir As String, ByVal fno As Long, ByVal col As Long) As Boolean
Dim fname As String
Dim fileNo As Long
Dim text As String
Dim lno As Long
Dim data As Variant
readFile = False
'ファイル名の完全パスを作成
fname = datadir & "\" & "data" & fno & ".txt"
If dir(fname) = "" Then
MsgBox (fname & "は存在しません。")
Exit Function
End If
fileNo = FreeFile '空き番号取得
'ファイルオープン
Open fname For Input As #fileNo
'ファイル終端まで読み込む
lno = 0
Do Until EOF(fileNo)
Line Input #fileNo, text
lno = lno + 1
'最大行番号を超えた場合は、配列を拡張する
If lno > maxlineNo Then
maxlineNo = lno
ReDim Preserve lines(maxlineNo)
End If
'空白で分割
data = Split(text, " ")
If fno = 1 Then
'最初のファイルのみ、1番目の列を設定
lines(lno) = data(0)
End If
'ファイルは空白を付けて該当列データを付け足す
lines(lno) = lines(lno) & " " & data(col - 1)
Loop
Close #fileNo
'成功終了
readFile = True
End Function
'ファイル書き込み
Private Function writeFile(ByVal datadir As String, ByVal filename As String) As Boolean
Dim fname As String
Dim fileNo As Long
Dim text As String
Dim lno As Long
writeFile = False
'ファイル名の完全パスを作成
fname = datadir & "\" & filename
fileNo = FreeFile '空き番号取得
'ファイルオープン
Open fname For Output As #fileNo
'1行から最終行まで書き込む
For lno = 1 To maxlineNo
Print #fileNo, lines(lno)
Next
Close #fileNo
writeFile = True
End Function
-----------------------------------------------------
使用方法ですが、添付の図のように、シート名「デー管理」のシートに
B1にデーファイルが化のうされているフォルダ名
B2に最大データファイルの番号
B3に抽出列の番号
B4に作成ファイル名
を記述し、本マクロを実行します。
例では、
d:\goo\dataのフォルダから
data1.txt~data3.txt
の3列目を抽出し、out.txtに出力しています。
(out.txtはデータファイル格納フォルダと同じフォルダに格納されます)
ありがとうございます。
今年まとめたかったデータが思った通りにまとまっています。
今回のテストケースでは68万行×1000ファイルでしたのでファイルのリネームをしつつ、10回繰り返したらできました。
最小データファイル番号も追加できるかなと思い、書いてくださったコードに
Dim minffileNo As Long '最小データファイル番号
を追加してE2セルに最小ファイル番号を入力するようにして、
minfileNo=CLng(sh.Cells(2, "E").Value)
を追加しました。
そしてFor i = 1 To maxfileNo部分を
For i = minfileNo To maxfileNo
に書き直して走らせてみたのですが、結果が崩れてしまいました。
どのようにかというと、出力されたファイルの1行目が何やら不明な数値が並ぶ状態でした。
最小ファイル番号と最大ファイル番号で制御する場合、どのようにしたら良かったのでしょうか?
No.4
- 回答日時:
返信、ありがとうございました。
>ファイルあたり制限が2GBということならば100ファイルずつまでは何とかなるという計算ですか。
はい、それであれば、なんとか動くと思われます。
せめて、perlかrubyがインストールされていれば、2Gバイトの制限もなく、テキストファイルの扱いも簡単なので、
なんとかなるかと思うのですが、それらはインストールされていないのでしょうか?
又、「cmdはユーザーからは使えないように設定されています。」とは、コマンドプロンプト
が使えないようになっているということでしょうか?
No.3
- 回答日時:
1つのデータファイルは2Gバイト以内でしょうか。
又、作成するデータファイルも2Gバイト以内でしょうか。
VBAで標準で提供されている、open,read,write,closeの関数はたしか2Gバイトを超えると正常に動作しないはずです。
1つのデータの桁数は何文字でしょうか。
例えば、水平速度が、32.50 という数字なら5バイトを使います。更に空白が1バイト付加されるため6バイトになります。
もし、200万行でdata1.txtからdata10000.txtを水平速度について集計すると
概算で1行のサイズ=6バイト×10000=60000バイト
200万行なので
計=120000000000バイト=120,000,000,000バイト=120Gバイトになります。
この為VBA標準のファイル入出力関数は使用できません。
もし、何らかの方法でこの120Gバイトのテキストファイルを作成できたとしても、
このテキストファイルをexcelに取り込めるかどうかは非常に疑問です。
通常のパソコンのメモリは多くても10Gバイト程度かと思いますので、その上限をはるかに超えています。
一度、最大のサイズのデータファイルをつくるとすると、それがどの程度のサイズになるのかを
概算で計算していただけませんでしょうか。
又、処理の方法ですがVBAか他の言語かに関係なく、
出力用のデータファイルを一旦内部メモリに作り上げ、それを一気にファイルへ出力するのが、一番簡単ですが
今回は、メモリの使用量が多すぎます。
その為、現実的には、
1)data1.txtを読み込み、2列の200万行の出力ファイルを作成し、
2)次に、その出力ファイルとdata2.txtを読み込み、3列の200万行の出力ファイルを作成し、
・・・
10000)最終的に10001列200万行の出力ファイルを作成。
になるような気がします。
その為、ファイルIOに多量の時間を要することが考えられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- Excel(エクセル) ExcelVBA メモ帳を起動し名前を付けて指定フォルダに保存 2 2022/04/18 13:15
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba SelStart、SelLen教えてく...
-
【VBA】マクロの入ったファイル...
-
A列に記載されているフォルダ...
-
VBA listBoxから
-
ExcelVBA シート名を複数セルか...
-
現在のブックを閉じないで、マ...
-
Outlookの「受信日時」「送信者...
-
ユーザーフォームに別シートか...
-
VBAコンボボックスで選択した値...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
Outlookの「受信日時」「件名」...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
Excelのマクロでワードのテキス...
-
【ExcelVBA】インデックスが有...
-
VBA 別ブックからコピペしたい...
-
VBA実行後に元のセルに戻りたい
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコードを教えてください
-
【ExcelVBA】インデックスが有...
-
ExcelVBA シート名を複数セルか...
-
エクセルvbaについて
-
エクセルのマクロについて教え...
-
【VBA】マクロの入ったファイル...
-
VBA UserFormからの転記で
-
エクセルVBAの配列について
-
Excelで「Ctrl+c」、「Ctrl+v...
-
VBAコードについて教えてくださ...
-
ExcelのVBAコードについて教え...
-
Excel マクロについての相談
-
VBAで質問があります
-
VBAコードについて
-
【ExcelVBA】VBA実行でダイアロ...
-
Excel関数またはVBAでの質問に...
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
Outlookの「受信日時」「件名」...
おすすめ情報
補足いたします。
data1.txt data2.txt data3.txt・・・・・data1000.txt…場合によってはdata10000.txt
というのは、数値解析を行ったデータであり、1列目に対する時刻歴データが入っております。
例えば、data1.txtの一列目は対応するとある座標の名称であり、2列目には水平方向の変位がかかれており、3列目には鉛直方向の変位がかかれているといった具合です。4列目以降にも同様に解析結果が記載されております。
そのため、data1.txtの1というのは解析ステップ時刻歴データ1番目、data2.txtの2というのは解析ステップ時刻歴データ2番目を表しております。data1からdata1000やdataの末尾までのデータを解析ステップ時刻歴データ1から解析ステップ時刻歴データ最後までを列方向に並べて、グラフを書いてこそ意味が出てきます。
少々書き方がまずかったようですね。
例えばdata1.txtのファイルの中には
座標名称 水平変位 鉛直変位 水平速度 鉛直速度 水平加速度 鉛直加速度
の順番で並べられています。同様data2.txt data3.txtといったファイルの中にも同じ順番で記載されてます。例えば、data10.txtの 10は10ステップ目の解析数値を一纏めにしてあるものなのです。行いたいことは何百何千のファイルから水平加速度のみをステップ毎に横並びにしたファイルを作りたいということです。同様に水平変位のみ鉛直変位のみと解析結果ごとのになったファイルを作りたいという内容です。のため、行方向には座標名称、列方向には座標名称に対するステップ毎の解析結果が載っていて欲しいという案件であります。座標名称が200万行以上並ぶ事が予測されるのでvbaをエンジンとしたテキストファイル出力プログラムがありがたいです。
今後の計画を加味して計算してみました。最大150万行でdataがdata6000.txtとなる予想であります。
data1.txtあたりの大きさは最大の一列文字数(空白含む)は10バイトとなるので、一行サイズが
10バイト×10列×150万行=150MB
でありました。
作成しようとするファイルは
最大の一列文字数は10バイトとなるので、一行サイズが
10バイト×6000ファイル=60,000バイト
それが150万行のため
60,000バイト×1.500,000=9.0E+10バイト=90Gバイト
となりました。
ファイルあたり制限が2GBということならば100ファイルずつまでは何とかなるという計算ですか。それでも実現できたらずいぶん楽になりそうです。
メインメモリーは256GBあり有効メモリーは192GBなのでメモリーはおそらく余裕があると思われます。
(なおHDDは150TBあります)
よくよく考えれば、解析プログラムのベース言語がrubyなので、ruby動きますね・・・。自身がrubyをプログラム言語として使ったことがないから失念していました。すみません。
cmdはwinキー+Rを押して、ファイル名指定からの実行では起動しないようにされているという状態です。(過去にこれでユーザーミスで痛い目に見たようで自分からは使えないようになっているとのことです。)
cmdはwinキー+Rを押して、ファイル名指定からの実行からcmdを入れた場合は、起動権限がない旨が表示されますの間違いでした。
Rubyバージョンはディレクトリを探してみると2.0が入っていることになっております。
改善版、最高です。めちゃくちゃ早い。
年明けに本解析を始まるため、非常にありがたいです。
先ほどお礼を書いたため、補足の部分に記載させていただいています。
これ場手作業で延々と張り付ける作業から分析作業だけに集中できるようになります。
本当にありがとうございました。