How to return string array of each book with its chapters and verses?

3

Follow the code below:

var linha = string.Empty;
List<List<String>> livros = new List<List<String>>();

string[] filesArray = new DirectoryInfo($@"{pathname}\Biblia\JFA").GetFiles().Select(x => x.Name).ToArray();

for (int i = 0; i < filesArray.Length; i++)
{
    StreamReader arquivo = new StreamReader($@"{pathname}\Biblia\JFA\{filesArray[i]}", Encoding.UTF8);
    while ((linha = arquivo.ReadLine()) != null)
    {
        if (linha.StartsWith($">{filesArray[i].Replace(".txt","")}"))
        {
            // cria o novo capitulo, que é uma lista de versículos
            livros.Add(new List<string>());
        }
        else
        {
            // adiciona um versículo no último capitulo criado   
            livros.Last().Add(linha);

        }
    }
}

Inside a folder I have several notebooks, each notepad has your book. How can I return array with name of the book with its chapters and verses?

Following notepad example (Matthew.txt):

>MATEUS (1)
1 Livro da genealogia de Jesus Cristo, filho de Davi, filho de Abraão.
2 A Abraão nasceu Isaque; a Isaque nasceu Jacó; a Jacó nasceram Judá e seus irmãos;
3 a Judá nasceram, de Tamar, Farés e Zará; a Farés nasceu Esrom; a Esrom nasceu Arão;
4 a Arão nasceu Aminadabe; a Aminadabe nasceu Nasom; a Nasom nasceu Salmom;
5 a Salmom nasceu, de Raabe, Booz; a Booz nasceu, de Rute, Obede; a Obede nasceu Jessé;
6 e a Jessé nasceu o rei Davi. A Davi nasceu Salomão da que fora mulher de Urias;
7 a Salomão nasceu Roboão; a Roboão nasceu Abias; a Abias nasceu Asafe;
8 a Asafe nasceu Josafá; a Josafá nasceu Jorão; a Jorão nasceu Ozias;
9 a Ozias nasceu Joatão; a Joatão nasceu Acaz; a Acaz nasceu Ezequias;
10 a Ezequias nasceu Manassés; a Manassés nasceu Amom; a Amom nasceu Josias;
11 a Josias nasceram Jeconias e seus irmãos, no tempo da deportação para Babilônia.
12 Depois da deportação para Babilônia nasceu a Jeconias, Salatiel; a Salatiel nasceu Zorobabel;
13 a Zorobabel nasceu Abiúde; a Abiúde nasceu Eliaquim; a Eliaquim nasceu Azor;
14 a Azor nasceu Sadoque; a Sadoque nasceu Aquim; a Aquim nasceu Eliúde;
15 a Eliúde nasceu Eleazar; a Eleazar nasceu Matã; a Matã nasceu Jacó;
16 e a Jacó nasceu José, marido de Maria, da qual nasceu JESUS, que se chama Cristo.
17 De sorte que todas as gerações, desde Abraão até Davi, são catorze gerações; e desde Davi até a deportação para Babilônia, catorze gerações; e desde a deportação para Babilônia até o Cristo, catorze gerações.
18 Ora, o nascimento de Jesus Cristo foi assim: Estando Maria, sua mãe, desposada com José, antes de se ajuntarem, ela se achou ter concebido do Espírito Santo.
19 E como José, seu esposo, era justo, e não a queria infamar, intentou deixá-la secretamente.
20 E, projetando ele isso, eis que em sonho lhe apareceu um anjo do Senhor, dizendo: José, filho de Davi, não temas receber a Maria, tua mulher, pois o que nela se gerou é do Espírito Santo;
21 ela dará à luz um filho, a quem chamarás JESUS; porque ele salvará o seu povo dos seus pecados.
22 Ora, tudo isso aconteceu para que se cumprisse o que fora dito da parte do Senhor pelo profeta:
23 Eis que a virgem conceberá e dará à luz um filho, o qual será chamado EMANUEL, que traduzido é: Deus conosco.
24 E José, tendo despertado do sono, fez como o anjo do Senhor lhe ordenara, e recebeu sua mulher;
25 e não a conheceu enquanto ela não deu à luz um filho; e pôs-lhe o nome de JESUS.
>MATEUS (2)
1 Tendo, pois, nascido Jesus em Belém da Judéia, no tempo do rei Herodes, eis que vieram do oriente a Jerusalém uns magos que perguntavam:
2 Onde está aquele que é nascido rei dos judeus? pois do oriente vimos a sua estrela e viemos adorá-lo.
3 O rei Herodes, ouvindo isso, perturbou-se, e com ele toda a Jerusalém;
4 e, reunindo todos os principais sacerdotes e os escribas do povo, perguntava-lhes onde havia de nascer o Cristo.
ETC...
    
asked by anonymous 10.12.2017 / 19:27

1 answer

3

You can structure the way you're dealing with types a little better. Let's create a class to represent the book

public class Livro {
    public string Nome { get; set }
    public List<Capitulo> Capitulos { get; set; } = new List<Capitulo>();
}

Now the representation of a chapter

public class Capitulo {
    public List<string> Versos { get; set; } = new List<string>();
}

And finally, we will have the object that represents the bible. This can be List<Livro> .

// coleção dos caminhos para os arquivos txt que são os livros
List<string> arquivos = GetCaminhoArquivos();

var biblia = new List<Livro>();

foreach(var caminho in arquivos) {
  // cria um novo livro
  var livro = new Livro();

  using (StreamReader sr = new StreamReader(caminho, Encoding.UTF8)) {    
    // percorre as linhas do livro
    while ((linha = sr.ReadLine()) != null) {

      // se a linha inicia em >, cria novo capítulo
      if (linha.First() ==  '>') {
        livro.Nome = linha; // acho que vai ter que mudar essa linha :P
        livro.Capitulos.Add(new Capitulo());
      } else {

        // adiciona o versículo ao ultimo capítulo criado
        livro.Capitulos.Last().Versos.Add(linha);
      }
    }
    biblia.Add(livro);
  }
}

private List<string> GetCaminhoArquivos()
{
    return new DirectoryInfo($@"{pathname}\Biblia\JFA").GetFiles().Select(x => x.FullName).ToList();
}

If you want to return the book of John, for example

var livro = biblia.FirstOrDefault(livro => livro.Nome == "João");
livro.Nome; // retornaria João
livro.Capitulos; // os capítulos e seus versos
    
10.12.2017 / 19:53