タイピングのプログラムを作っています。

今、基になるファイル(Syokyuu1)があり
ローマ字設定をしなおして
新しいファイル(Syokyuu2)を作りたいと考えています。

FINum = FreeFile
Open "Syokyuu1.txt" For Input As #FINum
i = 0
Do While Not EOF(1)
Input #FINum, wk1(i)
i = i + 1
Loop
Close #FINum

という具合にSyokyuu1を読み込んで
wk1(100)に保存するところまでできました。

※ wk(n)の構造:wk(0)=inu,wk(1)=ennpitu,wk(2)=honn・・・

ここでwk(0)からwk(99)までローマ字の設定をしなおして
新しいファイルSyokyuu2を同じ構造で作成したいのです。
その場合どのように記述すればよろしいですか?
よろしくお願いします。

Syokyuu1の中は
"inu"
"ennpitu"
"honn"
という構造です。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ファイルレコードを読みこんで配列にストックされています。

学習書の解説では配列に一旦蓄える例が多いですが、ファイルレコードを読みこんで処理をして、ファイルへ書き出すとか印刷する場合は、まず配列を使わないロジックを考えるべきと思います。理由は(1)配列は要素に上限があり制約があること(2)メモリーが節約出来る(3)処理速度を遅くしない(4)ロジック思考力を鍛える(5)蓄える必要がないケースが多いなどを思います。シーケンシヤルファイルでテキスト形式のファイルの場合
  open filename for input as #1
do untill eof(1)
line input ,a
(処理)
loop
ご質問のケースでは、ファイルレコードデータは配列に入っており、レコードを読む必要はなく、配列の要素の上限が100なので
for i=1 to 100
(aを処理してbに文字列をセット)
print #1,b
(またはwrite #1,b)
next i
で良いと思います。
「処理」の中身はロジックで変わってくるもので、巧拙が分かれるところですが、私のは拙いやり方ですが
(1)zi,jiやja,jyaのような変換のペアーを配列にarray関数で持って(2)instr関数でペアー左を見つけて、(3)ペアー右に置きかえれば出来ると思います
Private Sub Form_Click()
' Open "samplei.txt" For Input As #1
Dim a(100) As String
'----簡単例のためデータをプログラム内にセットした
a(1) = "aaazibbbb"
a(2) = "aaaaaaazibbjabb"
a(3) = "aaajabbbbbaaa"
a(4) = "aajabbb"
' Open "sampleo.txt" For Output As #2
s = Array("", "zi", "ji", "ja", "jya") '2ペアーの例
'----------
For i = 1 To 4 '100 '4配列の例で手抜きします
' Line Input #1, a
x = a(i)
found = "no"
For j = 1 To 4 Step 2
p = InStr(a(i), s(j)) 'a(i)の中にs(j)があるかどうか探す
' Form1.Print s(j), p
If p = 0 Then
GoTo ex1 '見つからなければ次ぎの変換文字列で探す
Else
b = Left(a(i), p - 1) '見つかったストリングまでの文字列をセット
l = Len(a(i)) - (p - 1) - Len(s(j)) '変換後の文字列をセットを加える
b = b & s(j + 1) & Right(a(i), l) '残りの文字列をくっ付ける
a(i) = b
' Form1.Print b
found = "yes" '「見つかった」というflag
End If
ex1:
Next j
'------
If found = "no" Then
b = a(i) '変換対象の文字列が無ければ、元のままセット
End If
' Print #1, b
'----画面で確認のため記述をいれた
Form1.Print x
Form1.Print b
Form1.Print "---"
Next i
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
最初新しいファイルを作成するつもりでしたが
imogasiさんの回答をみてこういう考え方があるんだなぁ
と考えさせられました。

はじめ、プログラムがよくわからなかったのですが
今日一日考えてみてやっと理解しました。
これを参考に作ってみようと思っています。
ありがとうございました。

お礼日時:2002/01/08 23:40

「ローマ字設定をしなおして」とは、何を意味するのか判りません。

ローマ字つづりから、ひらがなつづりに変換することですか。分からないのは私だけでしょうか。

この回答への補足

例えば、
Syokyuu1のファイルで
"zinnja"(神社)というのを

Syokyuu2のファイルでは
"jinnjya"(神社)というふうに
ローマ字のつづりを(zi→ji,ja→jya)にかえて
新しいファイルを作るということです。


もっと単純に、
ローマ字設定をしなおすということを省いて言えば、
100個の文字列配列を
1行ずつ改行してSyokyuu2という名前にして
新しいファイルを作成したいのです。

補足日時:2002/01/06 03:29
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QC#で背景色の設定 (0xFFC0DBなど)

データベースに登録されている値(0xFFC0DB)を使って、
テキストボックスの背景色を設定したいと思っています。

= Color.Pink;
= Color.FromArgb(0xFF, 0xC0, 0xCB);

などは出来るのですが、0xFFC0DBをそのまま(?)使った方法が分かりません...
ご存じの方がいらっしゃいましたら、教えていただけないでしょうか?

----
int test;
testColor = データベースの値;
TextBox.BackColor = testColor;

Aベストアンサー

#3間違えました orz

int test;
testColor = Convert.ToInt32("0xFFC0DB", 16);
TextBox.BackColor = Color.FromArgb( testColor );

QVB6「コピー中のファイルをオープンしてinput #はするか?

VB6 WinXP等 ですが、(おそらくOSが)コピーしているファイルに対して(コピー先のファイル)をOPENしてinput #はするか(しないか)どうか疑問なのですが。当然、コピー先のファイルはコピー中なら不完全なので、OPENしてinput してしまうと不都合が生じるので。別のプロセスで開かれている場合はエラーが出るというですが・・・。大きなテキストファイルを作って自力でテストする必要があるでしょうか?OSの仕様に詳しいかたよろしくおねがいいたします。

Aベストアンサー

オープン時にロックかければよい。
コピー中のファイルはロックできずオープンエラーになる。

QLINE INPUT # の動作がExcel2002と2003で異なる

お世話になります。
色々な実行環境があるので苦労しています。

Excel2003とExcel2002で"LINE INPUT #"の動作が異なります。
(どちらもWindowsXpSp3上で動いています)

VBAでプログラムを書き、それぞれ(2003,2002)で動かしています。

読み込みファイルはCSV(行区切りは「0x0A])です。
このCSVファイルを"LINE INPUT #"で読み出すと、
Excel2003:「0x0A]を区切りに行単位でリードされる。
Excel2002:「0x0A]は無視されCSVファイル全体がリードされる。

コードは
---------------
dim strLineBuffer as String
ファイルオープン
Line Input #1, strLineBuffer
---------------
のような感じです。

ヘルプとかには「"LINE INPUT #"は「0x0A]は無視される」との
記載が多いですが、今、直面している場面では、
『「0x0A]は無視される』ものと『「0x0A]は無視されない』ものがあります。
とりあえずは、
FileSystemObjectのReadFile.readline
で2003も2002も同じ動作になりましたので、それを使用しています。

質問は、
「Excel2003とExcel2002で"LINE INPUT #"の動作が異なります。」が本当なのかどうなのかという点です。
開発環境によって色々なパッチやアップデートが行われているような状況です(把握しきれません)。

経験された方、情報をお持ちの方、よろしくお願します。

お世話になります。
色々な実行環境があるので苦労しています。

Excel2003とExcel2002で"LINE INPUT #"の動作が異なります。
(どちらもWindowsXpSp3上で動いています)

VBAでプログラムを書き、それぞれ(2003,2002)で動かしています。

読み込みファイルはCSV(行区切りは「0x0A])です。
このCSVファイルを"LINE INPUT #"で読み出すと、
Excel2003:「0x0A]を区切りに行単位でリードされる。
Excel2002:「0x0A]は無視されCSVファイル全体がリードされる。

コードは
---------------
dim...続きを読む

Aベストアンサー

>バイナリーエディターで何度も確認しました。
0Aの前に0Dがあれば、それは0D0Aなのですがそうはなっていないと
いうことですよね?
うーん。エクセルで適当なデータを作ってcsv保存しても改行コードは
0D0Aでしたし、メモ帳で作っても0D0Aだったんですけどね。。
どうすれば0Aになるのかが分かりませんね。
0D0AになればLINE INPUT #でも取り込めると思うのですが。。

あと気になるのは
>Excel2003:「0x0A]を区切りに行単位でリードされる。
てとこですが、私の場合バイナリエディタで改行コードを0Aにして試したら
CSVファイル全体が読み込まれました。(行単位で読まない)
同じexcel2003でも挙動が違うのは不可解です。

ちなみにコードは下記で試しました。参考までに。
Sub test()
Dim buf As String
Open "c:\work\aaa.txt" For Input As #1
Do Until EOF(1)
Line Input #1, buf
MsgBox buf
Loop
Close #1
End Sub

>バイナリーエディターで何度も確認しました。
0Aの前に0Dがあれば、それは0D0Aなのですがそうはなっていないと
いうことですよね?
うーん。エクセルで適当なデータを作ってcsv保存しても改行コードは
0D0Aでしたし、メモ帳で作っても0D0Aだったんですけどね。。
どうすれば0Aになるのかが分かりませんね。
0D0AになればLINE INPUT #でも取り込めると思うのですが。。

あと気になるのは
>Excel2003:「0x0A]を区切りに行単位でリードされる。
てとこですが、私の場合バイナリエディタで改行コードを...続きを読む

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。


このカテゴリの人気Q&Aランキング

おすすめ情報