
お世話になります。
テキストファイルの切り出し方法について教えて下さい。
現在数千万行のテキストファイルがありまして、そこからひつよな部分を切り出したいです。
切り出す部分は、特定文字列から2000行や4000行といった行数です。
たとえば
x 速度. y 速度. x-温度. y-温度.
という文字列があれば、その文字列を含み下4000行を切り出して、一番初めの物であれば
date_00001.txt
次は
data_00002.txt
といった形で保存していってほしいです。
エクセルマクロならば対応ができたのですが、行数が多すぎて、エクセルで処理できず立ち往生してしまっております。(現在は100万行程度ずつにある程度切り分けてマクロを回しておりますが、ミスが多発しております。)
rubyやpythonを動かすことは可能なのですがあまり詳しくなく、楽しいrubyを見て勉強している段階です。
すみませんが、詳しい方切り出し方及び連番ファイルの作成方法を教えて下さい。
No.3ベストアンサー
- 回答日時:
エクセルのマクロを作ってみました。
元ファイルが同じフォルダにあり、出力先も同じフォルダーにしてあります。
※ フォルダを変更したい場合は「ThisWorkbook.Path」が有る行を修正して下さい。
Sub Sample()
Const 対象文字 As String = "x 速度. y 速度. x-温度. y-温度."
Const 行数 As Long = 4000
Const 元ファイル名 As String = "元データ.txt"
Const 頭 As String = "date_"
Dim 行データ As String
Dim 元 As Integer
Dim 先 As Integer
Dim 出力名 As String
Dim 連番 As Long
Dim 位置 As Long
元 = FreeFile
Open ThisWorkbook.Path & "\" & 元ファイル名 For Input As #元
Do Until EOF(元)
Line Input #元, 行データ
If 行データ = 対象文字 Then
連番 = 連番 + 1
出力名 = ThisWorkbook.Path & "\" & 頭 & Format(連番, "00000") & ".txt"
先 = FreeFile
Open 出力名 For Output As 先
Print #先, 行データ
For 位置 = 2 To 行数
Line Input #元, 行データ
Print #先, 行データ
Next
Close #先
End If
Loop
Close
MsgBox ("終了しました")
End Sub
ありがとうございます。
なるほど、外部ファイルを読み込んでvbaとして回すときはLine Inputで一行ずつ読んでいくのですね。
勉強となりました。ありがとうございます。

No.6
- 回答日時:
rubyで作成しました。
----------------------------------------
# coding:WINDOWS-31J
def main()
if ARGV.count != 2
print "#{$0} 入力ファイル名 切り出し件数\n"
exit(10)
end
fname = ARGV.shift #入力ファイル名
ostr = ARGV.shift #切り出し件数
if ostr =~ /^\d+$/
ocount = ostr.to_i
else
ocount = 0
end
if ocount < 1
print "切り出し件数不正:#{ostr}\n"
exit(10)
end
find_str = 'x 速度. y 速度. x-温度. y-温度.' #検索文字列
fseq = 0 #出力ファイル番号
#入力ファイルオープン
File.open(fname) do |inf|
#最後まで読み込む
while line = inf.gets
# 検索対象の文字列が1行内に存在するなら、切り出しを行う
if line.include?(find_str)
fseq += 1
ofname = sprintf("date_%05d.txt",fseq)
#出力ファイルオープン
File.open(ofname,"w") do |outf|
#見出し行出力
octr = 1
outf.print line
#切り出し件数に達するか、入力ファイルが終わる迄繰り返す
while true
break if octr >= ocount
line = inf.gets
break if line == nil
octr += 1
outf.print line
end
end
end
end
end
end
main()
--------------------------------------------
実行方法は以下のようになります。
このスクリプト名をsample.rbとします。
コマンドプロンプトで以下のコマンドを入力します。
ruby sample.rb 入力ファイル名 切り出し件数
どうもありがとうございます。
rybyめちゃくちゃ早いですね。5000万行のデータを今さっき切り出してみたのですがすぐに終わって驚きました。
すみません、
検索対象の文字列を一緒に出力しないという方法もあるのでしょうか?
No.5
- 回答日時:
ruby でオブジェクト指向っぽく実装した例
class CutoutFile
_ def initialize
_ _ @counter = 0
_ _ @amount = 0
_ end
_ def start(a)
_ _ @amount = a
_ _ @counter += 1
_ _ c = sprintf("_%05d", @counter)
_ _ n = @name.gsub(/\.\w+$/, "#{c}\\1")
_ _ @file.close if @file
_ _ @file = File.open(n, "w")
_ end
_ def sufficient?
_ _ @amount <= 0
_ end
_ def output(s)
_ _ return if sufficient?
_ _ @amount -= 1
_ _ @file.puts(s)
_ _ finish if sufficient?
_ end
_ def finish
_ _ @file.close() if @file
_ _ @file = nil
_ end
end
File.open('yourpath/数千万行のテキストファイル') do |file|
_ cf = CutoutFile.new('outpath/出力ファイル名雛型.txt')
_ while s = file.gets
_ _ cf.start(切り出す行数) if s.start_with?('特定文字列')
_ _ cf.output(s)
_ end
_ cf.finish
end
プログラムありがとうございます。
どうやって使用するのか教えて下さい。
といいますのエラーが発生してしまいました。
testruby.rb:18: void value expression
_ _ return if sufficient?
testruby.rb:36: syntax error, unexpected end, expecting end-of-input
です。
# coding:WINDOWS-31J
がいるのかと思って文頭につけましたが結果は同じ行でエラーがあるという事でした。
変更した部分は
数千万行のテキストファイル・・・result.txt
切り出す行数・・・10000
です。
No.2
- 回答日時:
「x 速度. y 速度. x-温度. y-温度.という文字列があれば、その文字列を含み下4000行を切り出して」とありますが宜しければご回答ください。
☆ 文字列について
①「x 速度」などは行に含まれる(含まれるか?で判定する)
②「x 速度」などが行の内容である(同じか?で判定する)
③ その他(詳しく説明して下さい)
☆ 特定文字列について
④ 2000行など特定行内には他の特定文字列は無い、または有っても無視する。
⑤ 2000行など特定行内には他の特定文字列が有ったらそれぞれ処理する。
⑥ その他(詳しく説明して下さい)
☆ 特定文字列の位置について
⑦ 2000行など特定行数ごとのブロックになっている
⑧ 特定文字列の位置はランダムで決まりが無い
⑨ その他(詳しく説明して下さい)
★文字列について
「x 速度. y 速度. x-温度. y-温度.」
というブロックで一行となっています。(たまにz速度.という文字が追加されているファイルもありますが、同一のファイル内は同一の文字以外は出てきません)
★特定文字列について
④の記載通り、特定文字列は一切出てきません
★特定文字列の位置について
⑧のように位置はランダム(観測時間によって異なる)ため決まりがないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/15 16:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【fortran77】空行を含む数値デ...
-
Excelマクロ 空白セルを無視し...
-
VBAでcsvファイルもシートもあ...
-
【ExcelVBA】300万件越えCSVか...
-
Access VBA エラー2448について
-
[コンパイルエラー 修飾子が不...
-
VBA csvファイルのデータを...
-
CSVで余計な空行が入る
-
VBAで文字列を引数とするアドイ...
-
ファイル名を変数で書きこむfwr...
-
CSVデータの文字列置換
-
VBA テキストボックスを選択状...
-
fortranでデータの抜き出しをし...
-
複数のファイルをまたぐエクセ...
-
バッチ for /f 空白、スペース...
-
【ruby】zipファイルデータをST...
-
teratermで、ファイル名をinput...
-
VBAで複数のCSVからレコードセ...
-
ネストされた配列からのCSV出力...
-
EXCEL→CSV保存時のダブルクォー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fortranでNAのあるデータを読み...
-
Fortran:列数の分からないデー...
-
pycharmへのpysamインストール...
-
【fortran77】空行を含む数値デ...
-
pythonのエラーについて
-
ギャスケット作成。修正の解説...
-
【ruby】flockで掛けたロックを...
-
Rubyのルンゲクッタ法がうまく...
-
文字列の連結について教えて下...
-
Ruby 暗号化したファイルの復号...
-
[common lisp]データ読み込みに...
-
ファイルの切り出しプログラム...
-
バッチ処理 特定の文字以降を...
-
Excelマクロ 空白セルを無視し...
-
【ExcelVBA】300万件越えCSVか...
-
VBAでcsvファイルもシートもあ...
-
ダブルコーテーション付きでCSV...
-
ファイル名を変数で書きこむfwr...
-
INPUTタグ disabledの文字色を...
-
VBA テキストボックスを選択状...
おすすめ情報