从Ada中的文件中获取单词

从Ada中的文件中获取单词,ada,Ada,我有一个文件夹,其中包含一些文本文件。我试图一个接一个地浏览所有的文件,并计算我们在文本文件中看到每个单词的次数。 我知道如何打开文件,但一旦进入文件,我就不知道如何一个接一个地阅读每个单词,然后转到下一个单词 如果有人有一些想法来指导我,那就太好了 使用Get\u line将文件一行一行地读入字符串,然后将该行拆分为单个单词。您可以使用Get\u line将文件一行一行读入字符串,然后使用正则表达式:如果您使用的是Ada 2012,我建议您这样做: 带有Ada.Containers.Unfin

我有一个文件夹,其中包含一些文本文件。我试图一个接一个地浏览所有的文件,并计算我们在文本文件中看到每个单词的次数。 我知道如何打开文件,但一旦进入文件,我就不知道如何一个接一个地阅读每个单词,然后转到下一个单词


如果有人有一些想法来指导我,那就太好了

使用Get\u line将文件一行一行地读入字符串,然后将该行拆分为单个单词。

您可以使用Get\u line将文件一行一行读入字符串,然后使用正则表达式:

如果您使用的是Ada 2012,我建议您这样做:

  • 带有Ada.Containers.Unfinite\u Ordered\u映射
  • 实例化一个以
    String
    为键,以
    Positive
    为键的映射
  • 抓住绳子;我会使用单个字符串或
    -处理
  • 将输入的文本分解成单词;如果使用流,这可以在运行中完成
  • 当你得到一个单词(来自#4)时,如果它不存在,则将其添加到地图中,否则增加元素
  • 完成后,只需为WORD\u MAP循环的元素运行一个
    ,该循环将打印字符串和计数
  • 有几种方法可以处理#3中的字符串:

  • 通过递归函数调用[在非字字符或输入结束时终止]完全调整大小
  • 无界字符串
  • Vector(正,字符)--追加有效字符,转换为数组[string],并在遇到无效字符[或输入结尾]时添加到映射--工作变量
  • 非空访问字符串
    工作变量

  • 这里有一个方法,我需要一些与容器玩耍的时间。 考虑到多个文件,使用streams仍然是解决问题的最佳解决方案


    Text\u 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;
    
    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;
    
    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;
    

    Text\u Search.adb

    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;
    
    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;
    
    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;
    

    Test.adb

    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;
    
    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;
    
    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;
    

    @user2131763:我认为是时候让你去破解这些书了,而不是在StackOverflow上闲逛。建议你看看Strings包中的索引函数。它们是为您提供字符索引的灵活工具(例如“或者@user2131763基本正则表达式可以在线工作。因此你不需要文字。Marc C和Brian Drummond也提出了很好的观点。正则表达式——相当麻烦;我建议不要使用它们……在我的维护/开发工作中,它们很快就会变得脆弱和笨拙。@Brian:
    Find\u Token
    可能是应用程序这可能有点像用大锤拍打苍蝇,但是如果你要做这里提到的所有工作,你应该考虑使用,这将为你做所有的工作。我试着让OpenTooKon工作,但它不会。虽然这可能是试图使用dotnet编译器。我没有尝试使用它的经验。net编译器,如果发现您现在是唯一一个这样做的人,我不会感到惊讶。:-)维护人员可能对您的尝试感兴趣。是的,我想有一种方法可以在平台上轻松阅读Ada源代码,然后使用它(即Ada作为脚本语言)--我最初尝试使用JVM编译器制作一个小程序,以读取/解析/执行脚本标记中的Ada。。。但是gprmake不会识别JVM编译器,所以我尝试了DOTNET.+1-有点短,但这实际上是这里唯一指定与问题的琐碎程度相称的工作级别的答案。