Como mesclar muitos dados de arquivos de texto no banco de dados

0

Eu tenho cerca de 100 arquivos de texto. Os arquivos têm perguntas e 3 opções. Os arquivos são como o exemplo abaixo.

ab001.txt --- contains a question
ab001a.txt -- is the first choice
ab001b.txt ---is the second choice
ab001c.txt -- is the third choice

Existem milhares de arquivos como este.

Eu quero inseri-los no SQL ou primeiro talvez no Excel como ...
As primeiras colunas têm perguntas e as outras três colunas têm respostas. Os dois primeiros caracteres são os mesmos para alguns arquivos, parece que significa alguma categoria, então em torno de 30 questões têm os mesmos primeiros caracteres.

    
por Mirage 22.02.2010 / 00:52

2 respostas

1

Uma maneira fácil de colocá-las no Excel é combinar todas as perguntas em um arquivo, abri-lo no Excel e colocar o resultado na coluna 1. Depois faça o mesmo com todas as primeiras opções e coloque-as na coluna 2, segunda escolhas na coluna 3, e depois as terceiras escolhas na coluna 4.

A partir de uma interface de linha de comando Unix ou Linux, você pode fazer o seguinte:

cat [a-z][a-z][0-9][0-9][0-9].txt > questions
cat [a-z][a-z][0-9][0-9][0-9]a.txt > choicea
cat [a-z][a-z][0-9][0-9][0-9]b.txt > choiceb
cat [a-z][a-z][0-9][0-9][0-9]c.txt > choicec
    
por 26.02.2010 / 04:02
0

Eu tive uma necessidade semelhante, concatenando um grande número de arquivos com nomes semelhantes. Eu peguei uma pequena ferramenta de linha de comando em C #:

class Program
    {
    static int  Main(string[] args)
        {
        if (args.Length < 3)
            {
            Console.WriteLine("Expected three to four arguments: the input folder; the input pattern; the output file name; and (optionally) the number of header rows to skip in subsequent files.");
            return -1;
            }

        string  inputFolder  = args[0];
        string  inputPattern = args[1];
        string  outputFile   = args[2];
        int     headerRows   = args.Length == 4 ? Int32.Parse(args[3]) : 0;

        // Clean up inputs
        if (inputFolder.StartsWith("\"") && inputFolder.EndsWith("\""))  inputFolder = inputFolder.Substring(1, inputFolder.Length - 2);
        if (inputFolder.EndsWith("\") == false)                         inputFolder = inputFolder + '\';
        if (Path.IsPathRooted(outputFile) == false)                      outputFile  = inputFolder + outputFile;

        Console.WriteLine("Reading \"{0}\" from \"{1}\" to \"{2}\".", inputPattern, inputFolder, outputFile);

        // Merge the files
        int  records = 0;
        using (StreamWriter collectedFile = CreateCollectedFile(outputFile))
            {
            foreach (string filePath in Directory.GetFiles(inputFolder, inputPattern))
                {
                if (filePath == outputFile)  continue;

                Console.Write("Reading \"{0}\"...", filePath);

                // Note that we do not want to skip headers in the first file, as we want the final file to include *1* copy of the header
                int  recordsThisFile = AppendFile(filePath, collectedFile, records == 0 ? 0 : headerRows);

                Console.WriteLine("copied {0} records.", recordsThisFile.ToString("#,##0"));

                records += recordsThisFile;
                }
            }

        Console.WriteLine("Read {0} records.", records.ToString("#,##0"));
        return 0;
        }

    private static StreamWriter  CreateCollectedFile(string path)
        {
        if (File.Exists(path))  File.Delete(path);

        return new StreamWriter(path);
        }

    private static int  AppendFile(string from, StreamWriter to, int headerRows)
        {
        int  records = 0;
        using (StreamReader reader = new StreamReader(File.OpenRead(from)))
            {
            string  line;
            while (reader.EndOfStream == false)
                {
                line = reader.ReadLine();
                if (++records > headerRows)  to.WriteLine(line);
                }
            }
        return records;
        }
    }

Uso:

MergeFiles . ab???.csv Questions.csv 0
MergeFiles . ab????.csv Choices.csv 0

Observe o primeiro parâmetro, . , indicando o diretório atual.

Se você tiver um compilador C # à mão, isso será feito. Eu colocaria o binário, mas se você for propriamente paranóico, não gostaria de executar tal coisa de qualquer maneira.

Como Faucett aponta, o * NIX já tem bons utilitários para isso. Se você está no Windows, isso pode ajudar.

    
por 21.02.2013 / 21:49