HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0119
しんtxtファイルの操作9解決


しん

リンク

2011/1/19(Wed) 23:10:01|NO.36690

txtファイルを読み込んで、特定の文字数の行を削除する、というものを作りました。

notesel aaa
noteload "test.txt"
bb=1

repeat noteinfo(0)

noteget data,bb
if strlen(data)=1 : notedel bb : else : bb=bb+1

loop

notesave "test.txt"

noteunsel

end

これを実行しても一瞬ウインドウが表示されて、
3バイトの何も書かれていないtxtファイルになってしまいます。
if文の前に

mes data : stop

としてみたところ何も表示されなかったので、
noteloadがうまくいっていないようなのですが・・・。
初心者故の見落としがあると思うのですが、お手上げ状態で難儀しております。
アドバイスをお願いします。



この記事に返信する


ひらまる

リンク

2011/1/19(Wed) 23:25:59|NO.36691

とりあえず、以下の変更点で望みどおりの結果は得られると思います。

notesel aaa aaa = "A\nAB\nABC\nB\nBC\nBCD";noteload "test.txt" -> aaa = "A\nAB\nABC\nB\nBC\nBCD" bb=0;bb=1 -> bb = 0 repeat noteinfo(0) noteget data,bb if strlen(data)=1 : notedel bb : else : bb=bb+1 loop mes aaa;notesave "test.txt" -> mes aaa noteunsel ;end ->
原因として考えられるのは、
・カウンタであるbbが0ではなく1から始まっていた。
・"test.txt"を読み込んで"test.txt"に出力しているので、"3バイトの何も書かれていないtxtファイル"を読み込んでいた。
などでしょうか。
test.txtの中身をみていないのでなんとも言えないのですが、
結果だけなら上記のスクリプトで得られているのではないでしょうか。



しん

リンク

2011/1/20(Thu) 00:39:52|NO.36692

>>ひらまる様
アドバイスありがとうございます。

情報が足りませんでした。申し訳ありません。
処理したいtxtファイルは、15万行くらいの雑多な内容の単語・成句リストで、
これを「特定の文字数の行を削除」や「特定の語句を含む行を削除」など
いろいろな条件でふるいにかけ、スリムにしたいと考えています。

お教えいただいた内容なのですが、

notesel aaa aaa = "A\nAB\nABC\nB\nBC\nBCD"
すみません、この部分がよくわかりません。
note命令用に確保するバッファに、
txtファイルの中身をコピペで直接入れる、ということでしょうか?
バッファは変数と同じ???

また、ほかの部分のアドバイスに従い、以下のようにしてみました。

notesel aaa noteload "test.txt" bb=0 ; <- 1を0にした。「インデックスは0から」を忘れていた repeat noteinfo(0) noteget data,bb if strlen(data)=1 : notedel bb : else : bb=bb+1 loop notesave "test01.txt" ; <- 保存するファイル名を変えた noteunsel end
この結果、中身のない「test01.txt」ができました。
何が間違っているのでしょうか。



ひらまる

リンク

2011/1/20(Thu) 01:26:58|NO.36693

notesel aaa
aaa = "A\nAB\nABC\nB\nBC\nBCD"
は単純に、"test.txt"というファイルの中身がわからないので、
A
AB
ABC
B
BC
BCD
という内容であると仮定しただけです。実際は『noteload "test.txt"』で問題ありません。

修正後のスクリプトを保存し、同じフォルダに"test.txt"を作成し、中身を
A
AB
ABC
B
BC
BCD
として実行したところ、"test01.txt"というファイルが生成され、内容は
AB
ABC
BC
BCD
となっていました。
きちんと1文字しかない行が削除されていますね。
問題は"test.txt"の中身にあると思われます……が、
1行も削除されていないのではなく、1行も出力されていないというのはおかしいですね。
約15万桁のファイルサイズが大きすぎて読み込めていないのでしょうか。
ならば、

exist "test.txt" ; <- "test.txt"のファイルサイズを調べる FileSize = strsize ; <- existで取得したファイルサイズ「strsize」を「FileSize」に代入 sdim aaa, FileSize ; <- ノートパッド変数「aaa」のデフォルト文字数を、「FileSize」の値に設定 notesel aaa noteload "test.txt" bb=0 repeat noteinfo(0) noteget data,bb if strlen(data)=1 : notedel bb : else : bb=bb+1 loop notesave "test01.txt" noteunsel end
(最初の3行を追加しました)
上記のようにしてみてはいかがでしょうか。



SYAM

リンク

2011/1/20(Thu) 01:27:46|NO.36694

ところで、15万行もない、数十行程度のデータでやってみたらどうなりますか?



ひらまる

リンク

2011/1/20(Thu) 01:56:15|NO.36695

プログラミングをしていると、自分の書き方って変なのかな?
などと思い、他人にソースを見せるのは恥ずかしくなるものですが、
他人のソースを自分流に書き直すのって楽しくないですか?そうですか……

/*********************************** 〜変数の説明〜 LoadFileName <- 読込ファイル名 LoadFileSize <- 読込ファイルサイズ LoadFileMax <- 読込ファイル行数 LoadFileLine <- 読込ファイル調査行 SaveFileName <- 保存ファイル名 ************************************/ ;ファイル名定義 LoadFileName = "test.txt" SaveFileName = "test01.txt" ;ファイルサイズ取得 exist LoadFileName LoadFileSize = strsize sdim Note, LoadFileSize ;ファイル読込 notesel Note noteload LoadFileName LoadFileMax = notemax ;処理開始 repeat LoadFileMax ;調査行取得 LoadFileLine = cnt noteget Data, LoadFileLine ;1byteの場合 if strlen( Data ) == 1 { notedel LoadFileLine continue LoadFileLine } loop ;保存 notesave SaveFileName noteunsel ;ファイルを確認するのが面倒だからmesboxに出力 notesel Note ;入力元 pos 0, 0 mes "入力元ファイル内容" noteload LoadFileName mesbox Note, ginfo_sx / 2, ginfo_sy - 20 ;出力先 pos ginfo_sx / 2, 0 mes "出力先ファイル内容" noteload SaveFileName mesbox Note, ginfo_sx / 2, ginfo_sy - 20 noteunsel



購入者

リンク

2011/1/20(Thu) 02:31:17|NO.36696

テキストファイル保存時の文字コードの問題かも。

使用マシンがXPよりまえならテキスト容量制限の問題かも。

関係ないかも。



しん

リンク

2011/1/20(Thu) 08:13:33|NO.36697

おはようございます

>>購入者様

アドバイスありがとうございます。
原因はこれでした。test.txtは、対象となるtxtファイルをコピーして、
20行程度に直したものを使っていたのですが、
形式?をunicodeからshift-jisにしたらうまくいきました。
どうしてなのかはよくわかりませんが。

>>ひらまる様、SYAM様

アドバイスありがとうございます。
わざわざプログラムを書いていただいたのに、こんな原因で申し訳ありません。
示していただいたものはどれも期待通りの結果を得られました。
まだ知識が追いつかず、何をやっているのかよくわからないので、
教材にさせていただきます。
お騒がせしました。



SYAM

リンク

2011/1/20(Thu) 10:09:20|NO.36698

>どうしてなのかはよくわかりませんが。

解っておかないと、今後文字列を扱うときに同じワナに嵌りまくりますね・・・。


テキストファイルといえど、コンピュータに記録されたデータの実体は、全部、数値です。
数値を特定の法則で文字として解釈する取り決めにしたものが テキストファイルです。65は"A"、66は"B"…とか。

んで、unicodeとかShiftJISっていうのは、「どの文字をどういう数値で表すか」という法則の種類です

そして、HSPはShiftJISっていう法則を前提に動きます。

もしこの前提が崩れてしまうと、数値を違った文字として解釈してしまいます。
プログラムが、改行でもないものを改行だと思い込んじゃったりすると、おかしくなることは想像できますよね。
さらに、ShiftJIS前提のシステムが「文字列の終わり」と解釈するような数値(0です)が、途中で出てきてしまったら、システムはそこで文字列が終わってると勘違いしちゃいますね。unicodeだとあり得るのです。



ひらまる

リンク

2011/1/20(Thu) 14:30:16|NO.36699

cnvwtos()を使えば、unicodeからShiftJISに変換できます。(標準命令)
が、読み込んだテキストファイルがunicodeで書かれているか、ShiftJISで書かれているか、はたまたUTF-8などで書かれているかを調べるのはとても難しいです。
なので、あらかじめデータとして使うテキストファイルのエンコード形式は統一しておくことをおすすめします。



ONION software Copyright 1997-2023(c) All rights reserved.