1

テキストを含むファイルを含むフォルダーがあります。すべてのファイルを 1 つずつ調べて、テキスト ファイル内のすべての単語が何回表示されるかを数えようとしています。ファイルを開く方法は知っていますが、一度ファイルに入ると、単語を 1 つずつ読み、次の単語に移動する方法がわかりません。

誰かが私を導くためのアイデアを持っていれば、それは素晴らしいことです.

4

4 に答える 4

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;
于 2013-04-11T05:04:07.600 に答える
1

Get_Line を使用して一度に 1 行ずつファイルを文字列に読み取り、その行を個々の単語に分割します。

于 2013-04-08T14:23:33.220 に答える
0

Ada 2012 を使用している場合は、次の方法をお勧めします。

  1. With Ada.Containers.Indefinite_Ordered_Maps.
  2. Stringas keyおよびPositiveas Keyを使用して Map をインスタンス化します。
  3. 文字列をつかみます。単一の文字列またはstream処理のいずれかを使用します。
  4. 入力テキストを単語に分割します。ストリームを使用する場合、これはオンザフライで実行できます。
  5. (#4 から) 単語を取得したら、それが存在しない場合はマップに追加し、そうでない場合は要素をインクリメントします。
  6. 終了したらFor Element of WORD_MAP Loop、文字列とカウントを出力する a を実行するだけです。

#3 で文字列を処理する方法はいくつかあります。

  1. [単語以外の文字または入力の終わりで終了する] 再帰関数呼び出しによって完全にサイズ設定されます。
  2. Unbounded_String
  3. Vector (Positive, Character) -- 有効な文字を追加し、配列 [文字列] に変換し、無効な文字 [または入力の終わり] が検出されたときにマップに追加します -- 作業変数。
  4. Not Null Access String作業変数。
于 2013-04-09T16:56:58.273 に答える
0

個々の単語を処理する代わりに、Get_Line を使用して一度に 1 行ずつファイルを文字列に読み込んでから、正規表現を使用できます。

于 2013-04-08T14:30:36.407 に答える