我有大约 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,这可能会有所帮助。