0

StackOverflow のクリエイティブな開発者およびナイト レンジャーの皆さん、こんにちは。マイクロソフト ドキュメント ファイルの辞書に約 2 万語を使用している顧客がいます。

彼は約 10 年前にそれを作成しました。現在、これらの *.doc ファイルの内容をデータベースにロードして、顧客用の辞書を作成する必要があります。

私の質問は、列に基づくテキストを任意の種類のデータベースに変更するためにどこから始めればよいですか?

RegEx を使用し、いくつかのパターンを使用することを考えています。クールな提案はありますか?

4

2 に答える 2

1

Sample in C#:

For starters, add a reference to Microsoft.Office Interop.Word. Then you can do some basic parsing:

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

For more complex parsing, you can save each item as a new textfile:

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();
}

You may also need to create a file named schema.ini and put it in the same folder as the text files (more details on the syntax here):

//assuming the delimiter is a ;
File.WriteAllLines(schemaPath,
    from item in newPaths
    select String.Format(@"
        [{0}]
        Format=Delimited(;)
    ", item.filename)
);

Then, you can query the resulting text files using SQL statements, via the OleDbConnection, OleDbCommand, and OleDbReader classes.

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 に答える
1

ここでの主な問題は、データがテキストで保存されていることではなく、データが .doc ファイルとそこのテーブルに保存されており、それらが多くのファイルに含まれていることです。

したがって、次のことを行う必要があります。

  • 1 つのファイルに結合します。
  • それをSQLテキストに変換します
  • テキストファイルに変換します

これは任意の順序で行うことができますが、順序によって方法が大きく変わります。

MS-Word マクロを (Basic で) 作成して、それを SQL テキストに変換し、ドキュメントを 1 つに結合することができます。

または、ドキュメントを RTF に変換してから、好きな言語で書き込みスクリプトを実行して、残りを行うこともできます。

正規表現は確かに便利ですが、ファイルがどのように見えるかを指定していないため、正規表現がどのように見えるべきかを言うことはできません.

ファイルがそれほど多くない場合は、コピー & ペーストを使用して単純なテキスト ファイルに入れることを検討できます。これでテーブルもなくなります。結果は醜いかもしれませんが、SQL に変換できる構造であることには変わりありません。

于 2013-03-19T22:51:14.730 に答える