プロが教えるわが家の防犯対策術!

お世話になります。複数の連番テキストファイルの処理方法にて教えていただきたいです。
現在スペース区切りのテキストファイルで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万行を超えてくるのが確定しているため、上記でエクセルに展開というところは直接新規テキストファイルに並べるという方がありがたいですが、こちらは可能なのでしょうか?(その集計ファイルの名前は任意でつけれるともっと嬉しいです)

わがままなお願いなのはわかっておりますが、受け入れてくださるとありがたいです。

質問者からの補足コメント

  • 補足いたします。
    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から解析ステップ時刻歴データ最後までを列方向に並べて、グラフを書いてこそ意味が出てきます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/12/25 22:15
  • 少々書き方がまずかったようですね。
    例えばdata1.txtのファイルの中には
    座標名称 水平変位 鉛直変位 水平速度 鉛直速度 水平加速度 鉛直加速度
    の順番で並べられています。同様data2.txt data3.txtといったファイルの中にも同じ順番で記載されてます。例えば、data10.txtの 10は10ステップ目の解析数値を一纏めにしてあるものなのです。行いたいことは何百何千のファイルから水平加速度のみをステップ毎に横並びにしたファイルを作りたいということです。同様に水平変位のみ鉛直変位のみと解析結果ごとのになったファイルを作りたいという内容です。のため、行方向には座標名称、列方向には座標名称に対するステップ毎の解析結果が載っていて欲しいという案件であります。座標名称が200万行以上並ぶ事が予測されるのでvbaをエンジンとしたテキストファイル出力プログラムがありがたいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/12/26 00:37
  • 今後の計画を加味して計算してみました。最大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あります)

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/12/26 10:50
  • よくよく考えれば、解析プログラムのベース言語がrubyなので、ruby動きますね・・・。自身がrubyをプログラム言語として使ったことがないから失念していました。すみません。

    cmdはwinキー+Rを押して、ファイル名指定からの実行では起動しないようにされているという状態です。(過去にこれでユーザーミスで痛い目に見たようで自分からは使えないようになっているとのことです。)

    No.4の回答に寄せられた補足コメントです。 補足日時:2016/12/26 12:19
  • cmdはwinキー+Rを押して、ファイル名指定からの実行からcmdを入れた場合は、起動権限がない旨が表示されますの間違いでした。

    Rubyバージョンはディレクトリを探してみると2.0が入っていることになっております。

    No.6の回答に寄せられた補足コメントです。 補足日時:2016/12/26 13:46
  • うれしい

    改善版、最高です。めちゃくちゃ早い。
    年明けに本解析を始まるため、非常にありがたいです。
    先ほどお礼を書いたため、補足の部分に記載させていただいています。

    これ場手作業で延々と張り付ける作業から分析作業だけに集中できるようになります。
    本当にありがとうございました。

    No.12の回答に寄せられた補足コメントです。 補足日時:2016/12/28 00:32

A 回答 (12件中1~10件)

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版を使用したほうが、効率は良いと考えます。
この回答への補足あり
    • good
    • 0
この回答へのお礼

先ほど、旧式の方を使用させていただきました。無事動きました。
そして、新型、ありがとうございます。

お礼日時:2016/12/27 17:23

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に従って、パラメータを入力してください。
    • good
    • 0
この回答へのお礼

すみません。ありがとうございます。
電力復旧後、使用させていただきます。

お礼日時:2016/12/26 20:26

>上記のとおり修正したのちは、最小ファイルナンバーの指定は、必要なのでしょうか?


>必要ならば、私が前回質問したような形で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)最小ファイル番号>最大ファイル番号ならエラー
    • good
    • 0

>さらに解析機はネットワークにつながっていないPCなので手打ちで入力しているため、回答が遅くなり申し訳ありません



そのような事情であれば、どうぞゆっくりと返信ください。
なお、ruby版でも開始ファイル番号の指定を行うようにしたい場合は、その旨、補足ください。
開始ファイル番号で指定されたファイルのみ、1列目と指定列目のデータを抽出するようにします。
    • good
    • 0
この回答へのお礼

重ね重ねお世話になり、ありがとうございます。
巨大なファイルになるというのがわかってきたため、ruby番でも開始ファイル指定ができればありがたいです。
当初、ファイルサイズを全く気にしていたかったことが恥ずかしいです。

お礼日時:2016/12/26 18:11

>最小ファイル番号と最大ファイル番号で制御する場合、どのようにしたら良かったのでしょうか?


例えば、最小ファイル番号=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

に変えてください。
    • good
    • 0
この回答へのお礼

>data7.txtは、
>1列目のデータと指定された列のデータを抽出する」ということで良いのですか。

そういう意味でございます。
お早いお答えありがとうございます。
現在まだ停電中で(本日復旧は不可能とのこと)作業が行えませんが、質問させてください。
上記のとおり修正したのちは、最小ファイルナンバーの指定は、必要なのでしょうか?必要ならば、私が前回質問したような形でminfileNoを設定しておけばよいのでしょうか?

お礼日時:2016/12/26 17:06

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と違って、ファイルサイズの制限はありません。
メモリの許す限り巨大なファイルも扱えます。
少しずつファイルサイズを大きくして、確認してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。現在、建屋が不測の事態で全館停電となってしまい作業ができなくなってしまいました。現在は手元の携帯端末からアクセスしております。
年内にどうにかしなければならない分は先ほどのVBAを使用させていただきましたので一安心しております。
復旧後(めどが立っていないので本日できるかはわかりません)、状態チェックが終了したのちにご報告させていただきます。
(さらに解析機はネットワークにつながっていないPCなので手打ちで入力しているため、回答が遅くなり申し訳ありません)

お礼日時:2016/12/26 15:28

>cmdはwinキー+Rを押して、ファイル名指定からの実行では起動しないようにされているという状態です。


ということは、コマンドプロンプトは使用できますね。
コマンドプロンプトで
ruby -v
と入力すると以下のようなバージョンが表示されます。

ruby 2.3.1p112 (2016-04-26 revision 54768) [i386-mingw32]

rubyのバージョンは、いくつでしょうか?
1.8以下だと、まずいですが、1.9以上なら問題ありません。
この回答への補足あり
    • good
    • 0

以下のソースは、ファイルサイズが小さい前提でしか動作しませんが、


あなたの要件を実現する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はデータファイル格納フォルダと同じフォルダに格納されます)
「テキストファイルの列を抜き出しての連結方」の回答画像5
    • good
    • 0
この回答へのお礼

ありがとうございます。
今年まとめたかったデータが思った通りにまとまっています。
今回のテストケースでは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行目が何やら不明な数値が並ぶ状態でした。

最小ファイル番号と最大ファイル番号で制御する場合、どのようにしたら良かったのでしょうか?

お礼日時:2016/12/26 14:35

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


>ファイルあたり制限が2GBということならば100ファイルずつまでは何とかなるという計算ですか。
はい、それであれば、なんとか動くと思われます。

せめて、perlかrubyがインストールされていれば、2Gバイトの制限もなく、テキストファイルの扱いも簡単なので、
なんとかなるかと思うのですが、それらはインストールされていないのでしょうか?
又、「cmdはユーザーからは使えないように設定されています。」とは、コマンドプロンプト
が使えないようになっているということでしょうか?
この回答への補足あり
    • good
    • 0

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に多量の時間を要することが考えられます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!