0

您好 StackOverflow 的创意开发人员和夜间护林员,我有一个客户,他在 Microsoft 文档文件中的字典中有大约 20,000 个单词。

他大约在 10 年前创建了它,现在我必须将这些 *.doc 文件内容加载到数据库中,以便为客户创建字典。

我的问题是从哪里开始将基于列的文本更改为任何类型的数据库?

我正在考虑使用 RegEx 并使用一些模式。那么有什么很酷的建议吗?

4

2 回答 2

1

这里的主要问题不是数据存储在文本中,而是存储在 .doc 文件和那里的表中,并且它们存在于许多文件中。

所以你需要做的是:

  • 将其合并为一个文件。
  • 转换成sql文本
  • 将其转换为文本文件

您可以按任何顺序执行此操作,但顺序会大大改变方法。

您可以创建 MS-Word 宏(在 Basic 中),将其转换为 SQL 文本并将文档合并为一个。

或者您可以将文档转换为 RTF,然后以您喜欢的任何语言运行编写脚本来完成剩下的工作。

正则表达式肯定会很方便,但不能说它们应该是什么样子,因为您没有指定文件的外观。

如果文件不多,可以考虑使用复制粘贴将其放入一个简单的文本文件中。这也将摆脱桌子。结果可能很难看,但它仍然是结构,以便我可以转换为 sql。

于 2013-03-19T22:51:14.730 回答
1

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
            }
        }
    }
}
于 2013-03-26T21:49:47.097 回答