您好 StackOverflow 的创意开发人员和夜间护林员,我有一个客户,他在 Microsoft 文档文件中的字典中有大约 20,000 个单词。
他大约在 10 年前创建了它,现在我必须将这些 *.doc 文件内容加载到数据库中,以便为客户创建字典。
我的问题是从哪里开始将基于列的文本更改为任何类型的数据库?
我正在考虑使用 RegEx 并使用一些模式。那么有什么很酷的建议吗?
您好 StackOverflow 的创意开发人员和夜间护林员,我有一个客户,他在 Microsoft 文档文件中的字典中有大约 20,000 个单词。
他大约在 10 年前创建了它,现在我必须将这些 *.doc 文件内容加载到数据库中,以便为客户创建字典。
我的问题是从哪里开始将基于列的文本更改为任何类型的数据库?
我正在考虑使用 RegEx 并使用一些模式。那么有什么很酷的建议吗?
这里的主要问题不是数据存储在文本中,而是存储在 .doc 文件和那里的表中,并且它们存在于许多文件中。
所以你需要做的是:
您可以按任何顺序执行此操作,但顺序会大大改变方法。
您可以创建 MS-Word 宏(在 Basic 中),将其转换为 SQL 文本并将文档合并为一个。
或者您可以将文档转换为 RTF,然后以您喜欢的任何语言运行编写脚本来完成剩下的工作。
正则表达式肯定会很方便,但不能说它们应该是什么样子,因为您没有指定文件的外观。
如果文件不多,可以考虑使用复制粘贴将其放入一个简单的文本文件中。这也将摆脱桌子。结果可能很难看,但它仍然是结构,以便我可以转换为 sql。
C# 中的示例:
对于初学者,添加对Microsoft.Office Interop.Word
. 然后你可以做一些基本的解析:
var wdApp = new Application();
var dict = new Dictionary<string, string>();
//paths is some collection of paths to the Word documents
//You can use Directory.EnumerateFiles to get such a collection from a folder
//EnumerateFiles also allows you to filter the files, say to only .doc
foreach (var path in paths) {
var wdDoc = wdApp.Documents.Open(path);
foreach (Paragraph p in wdDoc.Paragraphs) {
var text = p.Range.Text;
var delimiterPos = text.IndexOf(";");
dict.Add(
text.Substring(0, delimiterPos - 1),
text.Substring(delimiterPos + 1)
);
}
wdDoc.Close();
}
//This can be done more cleanly using LINQ, but Dictionary<TKey,TValue> doesn't have an AddRange method.
//OTOH, such a method can be easily added as an extension method, taking IEnumerable<KeyValuePair<TKey,TValue>>
对于更复杂的解析,您可以将每个项目保存为一个新的文本文件:
var newPaths =
from path in paths
select new {
path,
//If needed, add some logic to put the textfile in a different folder
newPath = Path.ChangeExtension(path, ".txt")
};
var wdApp = new Application();
foreach (var item in newPaths) {
var wdDoc = wdApp.Documents.Open(item.path);
wdDoc.SaveAs2(
FileName: item.newPath,
FileFormat: WdSaveFormat.wdFormatText
);
wdDoc.Close();
}
您可能还需要创建一个名为的文件schema.ini
并将其放在与文本文件相同的文件夹中(有关语法的更多详细信息,请参见此处):
//assuming the delimiter is a ;
File.WriteAllLines(schemaPath,
from item in newPaths
select String.Format(@"
[{0}]
Format=Delimited(;)
", item.filename)
);
然后,您可以通过 、 和 类使用 SQL 语句查询生成的OleDbConnection
文本OleDbCommand
文件OleDbReader
。
foreach (var item in newPaths) {
var connectionString = @"
Provider=Microsoft.Jet.OLEDB.4.0;
Extended Properties=""text;HDR=NO;IMEX=1;""
Data Source=" + item.newPath;
using (var conn = new OleDbConnection(connectionString)) {
using (var cmd = conn.CreateCommand()) {
cmd.CommandText = String.Format(@"
SELECT *
FROM [{0}]
", item.newPath);
using (var rdr = cmd.ExecuteReader()) {
//parse file contents here
}
}
}
}