Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Поиск файлов по содержанию


Автор: Chef 23.5.2008, 18:15
Проблема такая:

В директории есть множество Word документов, мне нужно провести поиск и найти те документы где есть, нужная мне строка.

Пользоваться сервером Word, это медленно...... Но если знаете как быстро то скажите пожалуйста

Есть ли другии варианты ?


Автор: Rififi 23.5.2008, 18:39
Цитата(Chef @  23.5.2008,  18:15 Найти цитируемый пост)
Есть ли другии варианты ?

http://msdn.microsoft.com/en-us/library/ms691105.aspx

Автор: Stepan_Lameroff 23.5.2008, 21:18
<= Office 11
http://gnuwin32.sourceforge.net/packages/wv.htm
wrapper - http://tidyfornet.svn.sourceforge.net/viewvc/tidyfornet/trunk/wvfornet/

Office 12
http://www.microsoft.com/downloads/details.aspx?FamilyID=ad0b72fb-4a1d-4c52-bdb5-7dd7e816d046&DisplayLang=en

или
http://www.codeproject.com/KB/office/ExtractTextFromDOCXs.aspx

или
Код

        private const string documentRelationshipType =
            "http://schemas.openxmlformats.org/officeDocument/2006/" +
            "relationships/officeDocument";

        public static string DocxToText(FileInfo file)
        {
            StringBuilder result = new StringBuilder();
            XslCompiledTransform compiledTransform = new XslCompiledTransform();
            compiledTransform.Load("WordToText.xslt");
            using (Package document = Package.Open(file.FullName))
            {
                foreach (PackageRelationship relationship in document.GetRelationshipsByType(documentRelationshipType))
                {
                    Uri uri = PackUriHelper.ResolvePartUri(
                        new Uri("/", UriKind.Relative), relationship.TargetUri);
                    PackagePart part = document.GetPart(uri);

                    using (TextWriter writer = new StringWriter())
                    {
                        compiledTransform.Transform(new XmlTextReader(part.GetStream()), null, writer);
                        result.Append(writer.ToString());
                    }
                }
            }
            return result.ToString();
        }


WordToText.xslt
Код

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <xsl:output method="text" />
  <xsl:template match="/">
    <xsl:apply-templates select="//w:body" />
  </xsl:template>

  <xsl:strip-space elements="*"/>

  <xsl:template match="w:body">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="w:p">
    <xsl:apply-templates select="w:r" />
    <xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match="w:r">
    <xsl:apply-templates select="w:t" />
  </xsl:template>

  <xsl:template match="w:t">
    <xsl:apply-templates select="../w:rPr" />
    <xsl:value-of select="." />
  </xsl:template>
</xsl:stylesheet>


P.S.
Еще вот вспомнил http://sourceforge.net/projects/b2xtranslator
Может пригодится smile

Автор: Chef 23.5.2008, 22:38
Stepan_Lameroff 
Можешь код объяснить, а то чето как то не совсем понятно.....
Package - откуда этот тип ?

Rififi
Я с такого рода вещами первый раз сталкиваюсь, можно по подробней

Взарание всем спасибо

Автор: tea_723 23.5.2008, 22:56
Пример по IFilter:

http://www.codeproject.com/KB/cs/IFilter.aspx

Автор: Stepan_Lameroff 23.5.2008, 23:29
Цитата(Chef @  23.5.2008,  22:38 Найти цитируемый пост)
Package - откуда этот тип ?

Namespace:  System.IO.Packaging
Assembly:  WindowsBase (in WindowsBase.dll)
FW 3.0
В окошке "Add Reference" выбрать WindowsBase
Если FW 3.0(3.5), не стоит посмотрите пример http://www.codeproject.com/KB/office/ExtractTextFromDOCXs.aspx там для распаковки используется ICSharpCode.SharpZipLib (все документы формата OpenXML по сути являются zip архивами)
http://blogs.gotdotnet.ru/personal/vgabriel/content/binary/OXML_BOOK_RU.zip

Автор: Chef 23.5.2008, 23:30
tea_723 
Спасибо, полезная ссылка

Автор: Stepan_Lameroff 23.5.2008, 23:51
Chef
Стоит обратить внимание, что при работе с EPocalipse.IFilter возможны проблемы с Adobe 8+ AcroIF.dll (решается путем добавления %ProgramFiles%\Adobe\Acrobat 8.0\Acrobat\ в PATH). C Foxit PDF IFilter работает нормально.
P.S.
Если решили работать с IFilter, обратите внимание на http://msdn.microsoft.com/en-us/library/ms692535(VS.85).aspx.
Скорость работы будет намного лучше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)