Pergunta

Acabei de ter uma pergunta geral sobre como abordar um certo problema que estou enfrentando. Eu sou bastante novo em C, então tenha paciência comigo aqui. Digamos que eu tenha uma pasta com mais de 1000 arquivos de texto, os arquivos não são nomeados em nenhum tipo de ordem numerada, mas são alfabéticos. Para o meu problema, tenho arquivos de dados de estoque, cada arquivo recebe o nome do respectivo ticker da empresa. Quero escrever um programa que abra cada arquivo, leia os dados, encontre o baixo histórico e o compare com o preço atual e calcule a alteração percentual e, em seguida, imprima -os. Pesquisar e calcular não são um problema, o problema é fazer com que o programa passasse e abra cada arquivo. A única maneira de ver atacar isso é criar um arquivo de texto contendo todos os símbolos de ticker, fazendo com que o programa leia isso em uma matriz e depois execute um loop que primeiro abre o primeiro nome do arquivo na matriz, execute os cálculos, imprimindo A saída, feche o arquivo e depois volte para o segundo elemento (o próximo símbolo do ticker) na matriz. Isso seria bastante simples de configurar (eu acho), mas eu realmente gostaria de evitar digitar mais de mil nomes de arquivos em um arquivo de texto. Existe uma maneira melhor de abordar isso? Não está realmente pedindo código (a menos que haja alguma função incrível em C que fará isso por mim;)), apenas alguns conselhos de programadores C mais experientes.

Obrigado :)

EDIT: Isso está no Linux, desculpe, eu esqueci de meção que!

Foi útil?

Solução

Em Linux/Unix (BSD, OS X, Posix, etc.) você pode usar OPENDIR / readdir Para passar pela estrutura do diretório. Não há necessidade de gerar arquivos estáticos que precisam ser atualizados quando o sistema de arquivos tiver as informações desejadas. Se você deseja apenas um subconjunto de ações em um determinado momento, então usando glob seria mais rápido, também há Scandir.

Não sei quais são chamadas funções Win32 (Windows / Platform SDK), se você estiver desenvolvendo usando o Visual C ++ como seu compilador C. Procurando Biblioteca MSDN deve ajudá -lo.

Outras dicas

Supondo que você esteja correndo no Linux ...

ls /path/to/text/files > names.txt

é exatamente o que você quer.

Não há funções no padrão C que tenham nenhuma noção de "diretório". Você precisará usar algum tipo de função específica da plataforma para fazer isso. Para alguns exemplos, dê uma olhada em Esta postagem de cprogrammnig.com.

Pessoalmente, eu prefiro usar o opendir()/readdir() abordagem como mostrado no segundo exemplo. Funciona nativamente em Linux e também no Windows, se você estiver usando o Cygwin.

Abordagem 1) Eu teria apenas um diretório específico no qual tenho apenas esses arquivos contendo os dados do ticker e nada mais. Eu então usaria o C readdir API Para listar todos os arquivos no diretório e iterar em cada um executando o processamento de dados necessário. A que o ticker para o qual o arquivo se aplica é determinado apenas pelo nome do arquivo.

Prós: fácil de codificar

Contras: realmente depende de onde os arquivos são armazenados e de onde eles vêm.

Abordagem 2) Altere o formato do arquivo para que os arquivos do ticker comecem com um código mágico, identificando que este é um arquivo de ticker e uma string que contém o nome. Como antes de usar o ReadDir para iterar todos os arquivos na pasta e abrir cada arquivo, verifique se o número mágico está definido e leia o nome do ticker do arquivo e processe os dados como antes

Prós: Mais flexível do que antes. O nome do arquivo não precisa refletir o nome dos contras do ticker: mais difícil de codificar, o formato do arquivo pode ser corrigido.

Mas eu realmente gostaria de evitar digitar mais de mil nomes de arquivos em um arquivo de texto. Existe uma maneira melhor de abordar isso?

Eu resolvi exatamente o mesmo problema há algum tempo, embora para usos pessoais :)

O que eu fiz foi usar os comandos do shell do OS para gerar uma lista desses arquivos e redirecionar a saída para um arquivo de texto e meu programa foi executado através deles.

No código pseudo, seria assim, não posso definir o código, pois não tenho 100% de certeza se essa é a abordagem correta ...

for each directory entry
    scan the filename
         extract the ticker name from the filename
         open the file
              read the data
              create a record consisting of the filename, data.....
         close the file
         add the record to a list/array...
> sort the list/array into alphabetical order based on 
  the ticker name in the filename...

Você pode variar um pouco, se desejar, digitalize os nomes de arquivos nas entradas do diretório e classificá -los primeiro construindo um recorde com os nomes de arquivos primeiro, depois volte ao início da lista/matriz e abra cada um lendo individualmente os dados e colocando no disco então ....

Espero que isso ajude, cumprimentos, Tom.

No Unix, há o prático glob função:

glob_t results;
memset(&results, 0, sizeof(results));
glob("*.txt", 0, NULL, &results);
for (i = 0; i < results.gl_pathc; i++)
    printf("%s\n", results.gl_pathv[i]);
globfree(&results);

Soa para mim que você está procurando por um fluxo de trabalho do SharePoint Designer. O que posso pensar é esta lógica. Ao criar um fluxo de trabalho, você pode escolher as opções de início.

Selecionando ambos

  • "Inicie o fluxo de trabalho automaticamente quando um item é criado" - deve verificar o usuário A na coluna atribuída quando os itens forem criados e envie um e-mail.

  • "Inicie o fluxo de trabalho automaticamente quando um item é alterado" - quando o item de lista é atualizado com o usuário B na coluna atribuída, ele deve e-mail, graças à opção Para iniciar o fluxo de trabalho quando o item for alterado.

    Digite a descri&ccedil;&atilde;o da imagem aqui

    Talvez este tópico possa ajudá-lo ainda mais: fluxo de trabalho de design que emails em Atribuído para (exceto para criado por)

    editar: eu não testei isso sozinho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top