如何合并数据库中的多个文本文件数据

如何合并数据库中的多个文本文件数据

我有大约 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 个问题的第一个字符相同。

答案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

答案2

我也有类似的需求,需要连接大量名称相似的文件。我用 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,这可能会有所帮助。

相关内容