ab.com コミュニティ https://www.activebasic.com/forum/ |
|
テキストに一行ずつ処理 https://www.activebasic.com/forum/viewtopic.php?t=2446 |
ページ 1 / 1 |
作成者: | 三毛CAT [ 2008年8月05日(火) 14:58 ] |
記事の件名: | テキストに一行ずつ処理 |
テキストに対して一行(¥r¥nから次の¥r¥nに囲まれた範囲)ずつ処理します。 [ここをクリックすると内容が表示されます]
コード: Dim pos_s As DWord Dim pos_e As DWord Dim buffer As String Dim line As String Dim lineno As DWord buffer="" 'bufferに処理する文字列を入れる pos_s=1'行ごとの処理開始 lineno=1'行番号 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=Len(buffer) While pos_s<Len(buffer) if pos_s<>pos_e Then line=Mid$(buffer,pos_s,pos_e-pos_s) Else line="" '一行の文字列はlineに代入される 'ここに処理を書く pos_s=pos_e+2 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=Len(buffer) lineno++ Wend'行ごとの処理終了 サンプルプログラム [ここをクリックすると内容が表示されます]
テキストファイルを読み込んで一行ずつ違う色で表示します。
コード: #N88BASIC Dim pos_s As DWord Dim pos_e As DWord Dim buffer As String Dim line As String Dim lineno As DWord Dim name As String Dim hFile As HANDLE Dim length As DWord Dim alength As DWord *start Input "ファイル名:",name hFile=CreateFile(name,GENERIC_READ,0,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) if hFile=INVALID_HANDLE_VALUE Then color 2 Print "ファイルのオープンに失敗しました。" color 7 Goto *start End If length=GetFileSize(hFile,0) buffer=ZeroString(length) ReadFile(hFile,StrPtr(buffer),length,VarPtr(alength),ByVal 0) CloseHandle(hFile) pos_s=1'行ごとの処理開始 lineno=1 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=Len(buffer) While pos_s<Len(buffer) if pos_s<>pos_e Then line=Mid$(buffer,pos_s,pos_e-pos_s) Else line="" color lineno mod 7+1 Print lineno;"行目:";line pos_s=pos_e+2 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=Len(buffer) lineno++ Wend'行ごとの処理終了 color 7 goto *start |
作成者: | OverTaker [ 2008年8月05日(火) 18:44 ] |
記事の件名: | |
便乗して、AB5 CP5のサンプルを載せようと思います。 まず、テキストに対して1行ずつ処理する方法。 [ここをクリックすると内容が表示されます]
次に、ファイルから読み取った文字列を1行ずつ処理する方法。
コード: #console Dim string = "処理したい文字列" As String Dim reader = New System.IO.StringReader(string) Dim s = reader.ReadLine() While Not ActiveBasic.IsNothing(s) System.Console.WriteLine(s) s = reader.ReadLine() Wend System.Console.ReadLine()簡単な解説: StringReaderを利用して、テキストを1行ずつ読み取ります。StringReaderに読み取るStringを渡して初期化します。StringReaderからReadLineで次々に1行ずつ読み取っていくことが出来ます。読み込む文字列がなくなったとき、ReadLine()はNothingを返すので、ActiveBasic.IsNothing関数を使って、読み込みの終了を判定することが出来ます。 [ここをクリックすると内容が表示されます] コード: Imports System Imports System.IO Imports System.Collections.Generic #console Console.Write("ファイル名 : ") Dim filename = Console.ReadLine() As String Dim lines = File.ReadAllLines(filename) As List<String> Dim s As String Foreach s In lines Console.WriteLine(s) Next /* Foreachはこれと一緒 Dim i As Long For i = 0 To ELM(lines.Count) Console.WriteLine(lines) Next */ Console.ReadLine() 簡単な解説: System.IO.File.ReadAllLinesを使うことで、ファイルの内容の各行を配列に入れることが出来ます。ReadAllLinesにファイル名を渡すことで、そのファイルの各行を配列にしたListが返ってきます。あとは普通に添え字を使って任意の行数の文字列を読み取ることが出来ます。 ちなみに、ForeachはABCP5で追加された文法です。 AB開発Wikiにリファレンスがあるものもありますが、ablib/src/Classes/内のソースコード上のコメントにしか使い方が載っていないものもあります。 |
作成者: | みけCAT [ 2009年11月11日(水) 16:25 ] |
記事の件名: | バグがあったので修正します。 |
[ここをクリックすると内容が表示されます]
ちなみにHNを変えたのでみけCAT=三毛CATです。
コード: Dim pos_s As DWord Dim pos_e As DWord Dim buffer As String Dim line As String Dim lineno As DWord buffer="" 'bufferに処理する文字列を入れる pos_s=1'行ごとの処理開始 lineno=1 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=lstrlen(buffer)+2 While pos_s<lstrlen(buffer) if pos_s<>pos_e Then line=Mid$(buffer,pos_s,pos_e-pos_s) Else line="" '一行の文字列はlineに代入される 'ここに処理を書く pos_s=pos_e+2 pos_e=InStr(pos_s,buffer,Ex"\r\n") if pos_e=0 Then pos_e=lstrlen(buffer)+2 lineno++ Wend'行ごとの処理終了 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |