お世話になります。
pythonあるいはrubyでの出現数の数え方について教えてください。
やりたい事としては、エクセルでいうとcountifのようなことで、現在の文字列は今までに何回出現したのかというのを調べたいです。
例えば
before_count.txt
というファイルに以下のようなデータがあったとすると
_____
あか
だいだい
きいろ
みどり
あお
あい
むらさき
あか
きいろ
みどり
あか
あお
むらさき
あか
______
結果が
after_count.txt
というようなファイルで
____________
あか 1
だいだい 1
きいろ 1
みどり 1
あお 1
あい 1
むらさき 1
あか 2
きいろ 2
みどり 2
あか 3
あお 2
むらさき 2
あか 4
____________
というような感じで出力されてほしいです。
単純に出現回数だけならばpythonで辞書型を使ってcounter関数を使ってカウントさせると、何回該当する文字が出たかはわかりますが、上記の結果のように今何回目というのがわからなくなってしまいます。
上記には例えば、
「あか」
という単語は4回出てきますが、「あか」という文字の横全部に出現数がかかれています。
エクセルでやってはいたのですが、一万行を超えたあたりからぐっと動きが悪くなり長い間エクセルがハングアップ状態になってしまいます。
欲しい結果ファイルとしては、befor_count.txtの並び順のままafter_count.txtの2列目に現在の出現回数が表示したものです。組み方を教えてください。
No.2
- 回答日時:
1.pythonのバージョンは2でしょうか、それとも3でしょうか?
2.>>エクセルでやってはいたのですが、一万行を超えたあたりからぐっと動きが悪くなり長い間エクセルがハングアップ状態になってしまいます。
ということですが、pythonの辞書に相当する、vbaのScripting.Dictionaryは使用されましたか。
Scripting.Dictionaryを使用すれば1万行程度は全く問題ないはずですが。
3.pythonはバージョンが不明なので、とりあえずruby(1.9以上)のスクリプトを提示します。
before_count.txtはシフトJISコードが前提、Windowsでの動作前提です。
-----------------------------------------------------------
# coding:WINDOWS-31J
#
dic = Hash.new
File.open("before_count.txt") do |file|
while line = file.gets
line.chomp!
if dic.key?(line) == TRUE
dic[line] += 1
else
dic[line] = 1
end
end
end
dic.each do |key,value|
print key," ",value,"\n"
end
ありがとうございます。
pythonは2と3とで互換性に乏しいところがありますね。ご指摘感謝します。自分の環境はpython3です。明日、実験室に戻ったときに実行してみます。
No.3ベストアンサー
- 回答日時:
python3のコードを下記URLに書きました。
https://ideone.com/My0sl3
vbaのコードです。20万行で4,5秒でした。
---------------------------------
Option Explicit
Public Sub テキスト読み込み()
Dim fname As String
Dim out_fname As String
Dim fileNo As Long
Dim out_fileNo As Long
Dim text As String
Dim data As Variant
Dim dicT As Object
Set dicT = CreateObject("Scripting.Dictionary")
'ファイル名の完全パスを作成
fname = "D:\goo\data\before_count.txt"
out_fname = "D:\goo\data\after_count.txt"
If Dir(fname) = "" Then
MsgBox (fname & "は存在しません。")
Exit Sub
End If
out_fileNo = FreeFile '空き番号取得&オープン
Open out_fname For Output As #out_fileNo
fileNo = FreeFile '空き番号取得&オープン
Open fname For Input As #fileNo
'ファイル終端まで読み込む
Do Until EOF(fileNo)
Line Input #fileNo, text
If dicT.exists(text) = False Then
dicT(text) = 0
End If
dicT(text) = dicT(text) + 1
Print #out_fileNo, text & " " & CStr(dicT(text))
Loop
Close #fileNo
Close #out_fileNo
'成功終了
MsgBox ("完了")
End Sub
pythonのコードを実行した結果、60万行のファイルも一瞬で処理してもらえました。本当にありがとうございます。
VBAの方も便利なので、python3をインストールしていないコンピュータでも実施できます。
ベストアンサーにさせていただきます。
No.4
- 回答日時:
No3です。
Pythonのスクリプトはutf-8で記述してください。
before_count.txtが存在するディレクトリ下にこのスクリプトを作成し、そこで実行してください。
before_count.txtの文字コードはSHIFT_JISが前提です。
vba使用時の注意事項です。
このマクロは標準モジュールに登録してください。
fname = "D:\goo\data\before_count.txt"
out_fname = "D:\goo\data\after_count.txt"
については、あなたの環境にあわせて適切に設定してください。
before_count.txtの文字コードはSHIFT_JISが前提です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- 日本語 「~人」と「~名」の使い分け 2 2022/06/02 11:59
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
MATLABでカーブフィットしたデ...
-
shellのコマンド deffの差分の...
-
VBAでCSVファイルを途中行まで...
-
バッチファイルの作り方(CSV→...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
VBAコードを張り付け後のエクセ...
-
ListBoxのデータを高速でファイ...
-
JavaでCSVファイルを高速に読む...
-
至急お願いします。C言語で.img...
-
タブの色を変更する方法
-
vba dir の相対パス
-
while(<ハンドラ>) {} で行数を...
-
RSS自動生成で文字化け
-
perlをwindows環境でshift-jis...
-
awkスクリプトでダブルクォーテ...
-
unixでのファイルロックの方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名を複数個配列で確保...
-
Fortranで1行飛ばして読み込む方法
-
perlで指定範囲を複数ファイル...
-
Pythonでegrep機能をつかいたい
-
「パスが見つかりません」とい...
-
ifstream/ofstream について
-
テキストファイルの各行を配列...
-
Perlのワンライナーをスクリプ...
-
ifstream を利用した1行分のテ...
-
C++でのテキストファイル読み込...
-
perlプログラム 外部複数ファ...
-
system関数と引数について
-
Perl 重複カウント 上位3名
-
Pythonで非日本語のUnicode文字...
-
shellのコマンド deffの差分の...
-
perlで先頭の数値をみて昇順に...
-
Visual Basicを使って三平方の...
-
while文がうまく動かない
-
Perl Grepについて
-
Perlによるディレクトリ内の連...
おすすめ情報
すみません。pythonのバージョンは3を使っております。
エクセルに関しての記述が不味かったです。一万行を越えたあたりからでしれ、データ数は20万を越えることがざらにありまして。
vbaでのScripting.Dictionary構文は知りませんでした。これについても調べてみます。そしてwibdows環境の方がありがたいです。