テキストファイルの読み込みと処理

今日、インターネットでは、ストリート名の検索などのさまざまなサービスを利用できます。このチュートリアルでは、アクティブなインターネット接続を必要としない、ストリート名の検索ヘルプを実装する方法を示します。

まず、ドイツにあるすべてのストリートを列挙したリストstrassen_osm.txtから始めます。

ファイルサイズは約1.50MBで、約96000のエントリが格納されています。

ストリート名(最初の文字があれば十分)を入力するGuiXTスクリプト、結果テーブルなどは、以下のようになります。

pushbutton (2,110) “search” process=“search_street_va03.txt”
pushbutton (2,115) “choose” process=“use_street_va03.txt”
inputfield (2,84) “Search for street” (3,100) size=“25” name=“searchstreet”
inputfield (3,84) “Results:” (3,100) size=“25” name=“chosenstreet”
Table (4,84) (17,140) name=“streettab” title=”Streets rows=10 -singlerowselection
Column “Street name” size=40 name=“streets”

InputScriptの”search_street_va03.txt”において、VB.NET関数を呼び出し、この関数から受け取ったデータをSAP画面のテーブルに設定します(ここでは、結果を10行までに制限します)。

// Clear table
Set “V[streettab.*]”  “”
callvb result = tutorials.utilities.find_streets “&V[searchstreet]”
if not V[result=0]
message “&V[result]”
endif

copytext fromtext=“streets_results1” tostring=“streetTemp”
Set “V[streettab.cell.streets.1]” “&V[streetTemp]”

copytext fromtext=“streets_results2” tostring=“streetTemp”
Set “V[streettab.cell.streets.2]” “&V[streetTemp]”

//etc.

“tutorials.dll”クラスライブラリにある”utilities”クラスの”find_streets”関数において、テキストファイルを検索し、入力に一致するものを検索します。ここで、「一致する」とは、ユーザーが指定した文字でストリート名が始まることを意味します。その後、先のInputSript用に、この検索結果をGuiXTテキスト変数に代入します。

1    Public Function find_streets(ByVal search As String) As String
2
3         Try
4             If Not streets_read Then
5                 streets = File.ReadAllLines(“c:\temp\strassen_osm.txt”)
6                 streets_read = True
7             End If
8
9 Dim index = Array.BinarySearch(streets, search, New MyStringComparer())
10
11             ‘Default: Emtpy cell
12             For c As Integer = 1 To 10
13                 g.SetText(“streets_results” + c.ToString, “”)
14             Next
15
16             If index < 0 Then
17                 Return “Kein Eintrag gefunden”
18             End If
19
20             Dim mycomp As New MyStringComparer
21             Dim myIndex As Integer = index
22
23             While myIndex – 1 > 0 And mycomp.Compare(streets.ElementAtOrDefault(myIndex – 1), search) = 0
24
25                 myIndex -= 1
26
27             End While
28
29             For c As Integer = 0 To 9
30
31                 If mycomp.Compare(streets.ElementAtOrDefault(myIndex + c), search) = 0 Then
32                     g.SetText(“streets_results” + (c + 1).ToString, streets.ElementAtOrDefault(myIndex + c))
33                 End If
34             Next
35
36
37         Catch ex As Exception
38
39             Return ex.Message
40
41         End Try
42
43         Return “0”
44
45     End Function

注:

– 保存済みのリストを使用する場合、検索時間の大幅な短縮につながる(線形検索ではなく)バイナリ検索の使用を推奨します。
– ストリート名が格納されているテキストファイルは、ハードディスクから1度だけ読み込めば十分です。その後のデータ要求に対してはメモリのデータを利用できます。

ユーザーは、結果テーブルの任意の行をマークできます。その後、”choose”をクリックすると、選択したストリート名が入力フィールドに設定されます。

Set V[i] “1”
label selection
if  V[streettab.stat.rowselection.&V[i]=X]  
set V[chosenstreet] “&V[streettab.cell.streets.&V[i]]”
endif
Set V[i] “&V[i]” + 1
if not V[i=11]
goto selection
endif

return

結果: