新しいファイルの作成について

このQ&Aのポイント
  • タイピングのプログラムを作成し、新しいファイル(Syokyuu2)を作成する方法について教えてください。
  • Syokyuu1というファイルからデータを読み込み、一部のデータを変更して新しいファイルSyokyuu2を作成したいです。具体的な記述方法を教えてください。
  • Syokyuu1にはいくつかのデータが保存されていますが、それらのデータを読み込んで一部のデータを変更し、新しいファイルSyokyuu2を作成する方法を教えてください。
回答を見る
  • ベストアンサー

新しいファイルの作成について

タイピングのプログラムを作っています。 今、基になるファイル(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" という構造です。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.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

sakky_t
質問者

お礼

回答ありがとうございました。 最初新しいファイルを作成するつもりでしたが imogasiさんの回答をみてこういう考え方があるんだなぁ と考えさせられました。 はじめ、プログラムがよくわからなかったのですが 今日一日考えてみてやっと理解しました。 これを参考に作ってみようと思っています。 ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

「ローマ字設定をしなおして」とは、何を意味するのか判りません。ローマ字つづりから、ひらがなつづりに変換することですか。分からないのは私だけでしょうか。

sakky_t
質問者

補足

例えば、 Syokyuu1のファイルで "zinnja"(神社)というのを Syokyuu2のファイルでは "jinnjya"(神社)というふうに ローマ字のつづりを(zi→ji,ja→jya)にかえて 新しいファイルを作るということです。 もっと単純に、 ローマ字設定をしなおすということを省いて言えば、 100個の文字列配列を 1行ずつ改行してSyokyuu2という名前にして 新しいファイルを作成したいのです。

関連するQ&A

  • テキストファイルの閉じ方について

    いつもお世話になります。 環境はXPを使用しています。 VBAでセルに設定してあるハイパーリンクを開くと テキストファイルが開くようにしてあります。 このテキストファイルを閉じようとするのですが、 閉じません。 ちなみにソースは以下の通りです。 intFileNum = FreeFile Open strFileName For Input As intFileNum i = 1 Do While Not EOF(intFileNum) Input #intFileNum, TextLine Cells(i, 1) = TextLine i = i + 1 Loop Close #intFileNum 最後のCloseで閉じないのはなぜですか? 初めてテキストファイルを操作するのでよくわかりません。 よろしくお願いします。

  • ファイルの読み込み

    タイピングソフトを作っています。 メインのフォーム(タイピング画面)に 配列wk1(99)(ローマ字用)、wk2(99)(日本語)を宣言してます。 まだ初級しか作成してないでメインフォーム(タイピング画面)で Private sub Yomikomi() wk1(0)="hudebako",wk(0)="筆箱" wk1(1)="pasokonn",wk(1)="パソコン" wk1(99)="neko",wk(99)="ネコ" End sub という感じで100個読み込ませてます。 初級だけならよいのですが、その他に中級、上級の2つを準備したいのです。 そうなるとメインのプログラムがとても長くなってしまうので syokyuu,tyuukyuu,jyoukyuuというファイル名で3つのファイルを テキストファイルか何かで準備して メインフォームでそのファイル(指定したファイル)を読み込んで wk1,wk2に計100個保存したいのです。 そういう場合はどのように設定すればよいですか(読み込んで保存すること)? 準備するファイルはテキストファイルでもいいのでしょうか? またその中身の記述はどうすればよいですか? 長くなりましたがよろしくお願いします。

  • VBA-読み込んだテキストファイルを並び替えて書き出したい

    VBA-読み込んだテキストファイルを並び替えて書き出したい ch1=FreeFile Open A for Input as ch1 ch2=FreeFile Open B for Input as ch2 DO while Not EOF(ch1) Line Input #ch1,buf Print #ch2,buf Loop Close #ch1,#ch2 で読み込み、書き出すことはできました。 やりたいことは、書き出す時に、項目を並べ替えたいのです。 例 にんじん りんご ねこ だいこん バナナ いぬ ↓ りんご ねこ にんじん バナナ いぬ だいこん よろしくお願いいたします。 区切りはタブです。

  • ファイルの開き方について

    1 2 3 4 5 6 上記のように文字と文字の間が半角スペース一つで区切られている ファイルを配列に Datatable(1)=1 Datatable(2)=2 Datatable(3)=3 Datatable(4)=4 Datatable(5)=5 Datatable(6)=6 のように格納するにはどうすればよいのでしょうか。 Open MyPath & "DataBaseJ.dat" For Input As #1 Do Until EOF(1) i = i + 1 Input #1, DB(i) Loop Close #1 上記のようにすると 1 2 3 4 5 6 と一行が Datatable(1)=1 2 3 4 5 6 と格納されてしまいます。 「,」で区切っているとそれぞれが分かれて格納されてくれるのですが… よろしくお願いします。

  • VBAフォルダ内ファイル入出力について

    Accessで特定のフォルダ内にあるcsvファイルを全て読み込み、別のcsvファイルへ 出力するという処理を作りたいのですが、最近からVBAを始めたばかりで どうすればよいか分かりません。 とりあえず、特定のファイルをひとつ読み込み、別ファイルへ出力することはできました。 Option Compare Database Private Sub Button_Click() Dim No As Integer Dim buf No = FreeFile Open "C:\test1.csv" For Input As #1 Open "C:\test2.csv" For Output As #2 Do Until EOF(No) Line Input #1, buf Print #2, buf Loop MsgBox "処理終了" Close #1 Close #2 End Sub 読み込み対象を「特定のフォルダ内のファイル全て」 にする方法が知りたいです。 ちなみに出力先のファイルはひとつにまとめてもそれぞれ別のファイルに 出力でもどちらでも構いません。 できれば両方教えていただければ有難いです。 宜しくお願いします。

  • CSVファイルの「”」について

    VB6でCSVファイルを読み込みたいのですが、 以下のような項目だと、1項目として読み込むことができません。 例) AAA,"BBB,CCC,"" """,DDD "BBB,CCC,"" """ を1項目として読み込みたいのですが ダブルコーテーションの括りの中に、更にダブルコーテーションがあると うまくいかないみたいです。 何か方法がありますでしょうか? Open DownLoadFile For Input As #1 Len = 32000 Input #1, rec Do Until EOF(1) 処理1 Loop close #1

  • Excelで作成されたCSVのVBでの読み込み

    いつもお世話になっております。 Excel2K、2002を使用しております。 Excelで作成されたCSVファイルをVBAで読み込もうと、以下の関数を作成しました。 Public Function CsvRead(ByVal FileName As String)   Dim IntFileNum As Integer 'ファイル番号   Dim TmpStr As String '   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Input #IntFileNum, TmpStr     '     '~その他の処理~     '   Loop   Close End Function その他の処理中で特定の列に対し、特殊な処理を行う必要があるのですが ExcelでCSVファイルを作成する場合、16行単位でカンマの変動が起こりえますので、 http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B400253 正確な列が取れません。 そこで1行読み込んでカンマで分解すればよいかと思い、 以下のように読み込んでみたのですが、、   Dim TmpStr() As String '   Dim LineStr As String   IntFileNum = FreeFile   Open FileName For Input As #IntFileNum 'CSVファイルのオープン   Do Until EOF(IntFileNum)     Line Input #IntFileNum, LineStr     TmpStr = Split(LineStr, ",")     '     '~その他の処理~     '   Loop 値にカンマが存在する場合も区切ってしまうので これも正しく取れませんでした。 値のカンマは区切り文字として判定せず、 正しく値を取得するにはどのようにすればよいでしょうか。 上記のことをふまえた判定をすべて行うしかないでしょうか。 ご教授のほど、よろしくお願いいたします。

  • ファイルを読み込むとデータが変わるのはなぜ?

    Excel VBAでOpenメソッドを使ってtxtファイルを読み込みセルに表示させると、 txtファイルに書いてある値と違う値が表示されてしまいます。読ませたデータは、106303314215443605050000,05D0NPZHRPF0,000CE5155098です。これが 1.06303E+23,05D0NPZHRPF0,000CE5155098となってしまいます。原因がわからず困っています。ソースは次の通りです。 '開くファイル名を取得 getF_name = Application.GetOpenFilename("テキストファイル(*.txt),*.txt") If getF_name = False Then Exit Sub End If 'i = Worksheets("管理台帳2").Range("B65536").End(xlUp).Row i = 3 'ファイルを開いて、データを読み込む Open getF_name For Input As #1 Do Until EOF(1) Input #1, myBuf1, myBuf2, myBuf3 If myBuf2 = myBuf3 Then Worksheets("管理台帳2").Cells(i + 1, 2).Value = myBuf1 Else Worksheets("管理台帳2").Cells(i + 1, 3).Value = myBuf1 Worksheets("管理台帳2").Cells(i + 1, 4).Value = myBuf2 Worksheets("管理台帳2").Cells(i + 1, 5).Value = myBuf3 End If i = i + 1 Loop '開いたファイルを閉じる Close #1 'セルをデータの幅に調整 Worksheets("管理台帳2").Select Columns("A:A").EntireColumn.AutoFit Columns("B:B").EntireColumn.AutoFit Columns("C:C").EntireColumn.AutoFit どなたか教えて頂けませんか?宜しくお願いいたします。

  • VBAでCSVファイルを読み込もうとしていますが、

    VBAでCSVファイルを読み込もうとしていますが、 「ファイルが見つかりません」とエラーが表示されます。 どのように対処していいのかわかりません。 教えてくください。 Sub readCsv() Dim csvFile As String Dim ch As Integer Dim csvStr As String Dim str() As String Dim i As Integer Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) targetFolder = oFolder.Items.Item.Path Set fso = CreateObject("Scripting.FileSystemObject") Set fileList = fso.GetFolder(targetFolder).Files For Each file In fileList csvFile = file.Name ch = FreeFile Open csvFile For Input As #ch i = 1 Do While Not EOF(1) Line Input #ch, csvStr Close #ch str = Split(csvStr, ",") Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop Next End Sub

  • VisualBasicからcsvファイルを読み込む

    VisualBasicからcsvファイルを以下のようなプログラムで読み込んでいます。 Open ファイルパス For Input Shared As #1 Do Until EOF(1): Input #1, A(i), B(i): i = i + 1: DoEvents: Loop Close #1 n行2列のcsvファイルとn行3列のcsvファイルを読み込んだ時に A(2)にセルB1、B(2)にセルB2の値を代入したいです。 現状だとn行3列のcsvファイルを読み込んだ時に A(2)にはセルA3の値が入ってしまいます。 n行3列の3列目のデータは無視したいです。