テキストを含むファイルを含むフォルダーがあります。すべてのファイルを 1 つずつ調べて、テキスト ファイル内のすべての単語が何回表示されるかを数えようとしています。ファイルを開く方法は知っていますが、一度ファイルに入ると、単語を 1 つずつ読み、次の単語に移動する方法がわかりません。
誰かが私を導くためのアイデアを持っていれば、それは素晴らしいことです.
テキストを含むファイルを含むフォルダーがあります。すべてのファイルを 1 つずつ調べて、テキスト ファイル内のすべての単語が何回表示されるかを数えようとしています。ファイルを開く方法は知っていますが、一度ファイルに入ると、単語を 1 つずつ読み、次の単語に移動する方法がわかりません。
誰かが私を導くためのアイデアを持っていれば、それは素晴らしいことです.
コンテナで遊ぶ時間が必要でした。複数のファイルを考えると、ストリームを使用することは、依然として問題の最良の解決策です。
Text_Search.ads
Pragma Ada_2012;
With
Ada.Containers.Indefinite_Ordered_Maps;
Package Text_Search with Elaborate_Body is
Text : Constant String :=
ASCII.HT &
"We hold these truths to be self-evident, that all men are created " &
"equal, that they are endowed by their Creator with certain unalienable "&
"Rights, that among these are Life, Liberty and the pursuit of " &
"Happiness.--That to secure these rights, Governments are instituted " &
"among Men, deriving their just powers from the consent of the governed" &
", --That whenever any Form of Government becomes destructive of these " &
"ends, it is the Right of the People to alter or to abolish it, and to " &
"institute new Government, laying its foundation on such principles " &
"and organizing its powers in such form, as to them shall seem most " &
"likely to effect their Safety and Happiness. Prudence, indeed, will " &
"dictate that Governments long established should not be changed for " &
"light and transient causes; and accordingly all experience hath shewn, "&
"that mankind are more disposed to suffer, while evils are sufferable, " &
"than to right themselves by abolishing the forms to which they are " &
"accustomed. But when a long train of abuses and usurpations, pursuing " &
"invariably the same Object evinces a design to reduce them under " &
"absolute Despotism, it is their right, it is their duty, to throw off " &
"such Government, and to provide new Guards for their future security." &
"now the necessity which constrains them to alter their former Systems " &
"of Government. The history of the present King of Great Britain is a " &
"history of repeated injuries and usurpations, all having in direct " &
"object the establishment of an absolute Tyranny over these States. To " &
"prove this, let Facts be submitted to a candid world.";
Package Word_List is New Ada.Containers.Indefinite_Ordered_Maps(
Key_Type => String,
Element_Type => Positive
);
Function Create_Map( Words : String ) Return Word_List.Map;
Words : Word_List.map;
End Text_Search;
Text_Search.adb
Package Body Text_Search is
Function Create_Map( Words : String ) Return Word_List.Map is
Delimiters : Array (Character) of Boolean:=
('.' | ' ' | '-' | ',' | ';' | ASCII.HT => True, Others => False);
Index, Start, Stop : Positive := Words'First;
begin
Return Result : Word_List.Map do
Parse:
loop
Start:= Index;
-- Ignore initial delimeters.
while Delimiters(Words(Start)) loop
Start:= 1+Start;
end loop;
Stop:= Start;
while not Delimiters(Words(Stop)) loop
Stop:= 1+Stop;
end loop;
declare
-- Because we stop *on* a delimiter we mustn't include it.
Subtype R is Positive Range Start..Stop-1;
Substring : String renames Words(R);
begin
-- if it's there, increment; otherwise add it.
if Result.Contains( Substring ) then
Result(Substring):= 1 + Result(Substring);
else
Result.Include( Key => substring, New_Item => 1 );
end if;
end;
Index:= Stop + 1;
end loop parse;
exception
When Constraint_Error => null; -- we run until our index fails.
end return;
End Create_Map;
Begin
Words:= Create_Map( Words => Text );
End Text_Search;
Test.adb
Pragma Ada_2012;
Pragma Assertion_Policy( Check );
With
Text_Search,
Ada.Text_IO;
Procedure Test is
Procedure Print_Word( Item : Text_Search.Word_List.Cursor ) is
use Text_Search.Word_List;
Word : String renames Key(Item);
Word_Column : String(1..20) := (others => ' ');
begin
Word_Column(1..Word'Length+1):= Word & ':';
Ada.Text_IO.Put_Line( Word_Column & Positive'Image(Element(Item)) );
End Print_Word;
Begin
Text_Search.Words.Iterate( Print_Word'Access );
End Test;
Get_Line を使用して一度に 1 行ずつファイルを文字列に読み取り、その行を個々の単語に分割します。
Ada 2012 を使用している場合は、次の方法をお勧めします。
With Ada.Containers.Indefinite_Ordered_Maps
.String
as keyおよびPositive
as Keyを使用して Map をインスタンス化します。stream
処理のいずれかを使用します。For Element of WORD_MAP Loop
、文字列とカウントを出力する a を実行するだけです。#3 で文字列を処理する方法はいくつかあります。
Not Null Access String
作業変数。個々の単語を処理する代わりに、Get_Line を使用して一度に 1 行ずつファイルを文字列に読み込んでから、正規表現を使用できます。