У меня есть около 100 текстовых файлов. Файлы имеют вопросы и 3 варианта. Файлы похожи на приведенный ниже пример.

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

Есть тысячи таких файлов.

Я хочу вставить их в SQL или сначала в Excel, как ...
В первых столбцах есть вопросы, а в остальных трех столбцах есть ответы. Первые два символа одинаковы для некоторых файлов, похоже, они обозначают некоторую категорию, поэтому примерно каждые 30 вопросов имеют одинаковые первые символы.

2 ответа2

1

Простой способ поместить их в Excel - это объединить все вопросы в один файл, открыть его из Excel и поместить результат в столбец 1. Затем сделайте то же самое со всеми первыми вариантами и поместите их в столбец 2, вторые варианты в столбец 3, а затем третий вариант в столбец 4.

Из интерфейса командной строки Unix или Linux вы можете сделать следующее:

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
0

У меня была похожая потребность, объединяя большое количество файлов с одинаковыми именами. Я подхватил небольшой инструмент командной строки в 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;
        }
    }

Использование:

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

Обратите внимание на первый параметр . с указанием текущего каталога.

Если у вас есть под рукой компилятор C #, это сработает. Я бы выложил бинарный файл, но если вы по-настоящему параноидальны, вы все равно не захотите запускать такие вещи.

Как отмечает Faucett, * NIX уже имеет хорошие утилиты для этого. Если вы работаете в Windows, это может помочь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .