ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月21日(火) 20:36

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年8月05日(火) 14:58 
テキストに対して一行(¥r¥nから次の¥r¥nに囲まれた範囲)ずつ処理します。
[hide]
コード:
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'行ごとの処理終了
[/hide]
[hide=サンプルプログラム]
テキストファイルを読み込んで一行ずつ違う色で表示します。
コード:
#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
[/hide]


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年8月05日(火) 18:44 
オフライン

登録日時: 2005年5月31日(火) 17:14
記事: 231
住所: 茨城県
便乗して、AB5 CP5のサンプルを載せようと思います。

まず、テキストに対して1行ずつ処理する方法。
[hide]
コード:
#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関数を使って、読み込みの終了を判定することが出来ます。
[/hide]

次に、ファイルから読み取った文字列を1行ずつ処理する方法。
[hide]
コード:
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[i])
Next
*/

Console.ReadLine()
簡単な解説:
System.IO.File.ReadAllLinesを使うことで、ファイルの内容の各行を配列に入れることが出来ます。ReadAllLinesにファイル名を渡すことで、そのファイルの各行を配列にしたListが返ってきます。あとは普通に添え字を使って任意の行数の文字列を読み取ることが出来ます。

ちなみに、ForeachはABCP5で追加された文法です。[/hide]

AB開発Wikiにリファレンスがあるものもありますが、ablib/src/Classes/内のソースコード上のコメントにしか使い方が載っていないものもあります。


通報する
ページトップ
投稿記事Posted: 2009年11月11日(水) 16:25 
[hide]
コード:
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'行ごとの処理終了
[/hide]

ちなみにHNを変えたのでみけCAT=三毛CATです。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[2人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke