【问题标题】:read an MSWord file into R将 MSWord 文件读入 R
【发布时间】:2020-02-25 00:45:56
【问题描述】:

是否可以将 MSWord 2010 文件读入 R?我有 Windows 7 和戴尔 PC。

我正在使用这条线:

my.data <- readLines('c:/users/mark w miller/simple R programs/test_for_r.docx')

尝试读取包含以下文本的 MSWord 文件:

A   20  1000    AA
B   30  1001    BB
C   10  1500    CC

我收到一条警告消息:

警告信息: 在 readLines("c:/users/mark w miller/simple R programs/test_for_r.docx") 中: 在“c:/users/mark w miller/simple R programs/test_for_r.docx”上找到不完整的最后一行

my.data 似乎是胡言乱语:

# [1] "PK\003\004\024" "¤l"             "ÈFÃË‹Átí"

我知道通过这个简单的示例,我可以轻松地将 MSWord 文件转换为不同的格式。但是,我的实际数据文件由几十年前输入的复杂表格组成,后来扫描成 pdf 文档。原始纸质文件的年代以及原始纸质、打字和/或扫描过程中可能存在的缺陷导致某些字母和数字不是很清楚。到目前为止,将 pdf 文件转换为 MSWord 似乎是正确翻译表格最成功的方法。将 MSWord 文件转换为 Excel 或富文本等,并不是很成功。即使在转换为 MSWord 之后,生成的文件也非常复杂并且包含许多错误。我想如果我可以将 MSWord 文件读入 R,这可能是编辑和更正它们的最有效方法。

我知道“package tm”我猜它可以将 MSWord 文件读入 R,但我有点担心使用它,因为它似乎需要安装第三方软件。

感谢您的任何建议。

【问题讨论】:

  • 据我所知,读取 MS Word 文件需要从 CRAN 安装一些软件包。您为什么担心安装第三方软件?
  • tm 包提供函数 readDOC()。这需要安装一个名为 antiword 的外部(非 R)工具。但是,我相信该包/工具只能读取 2003 版以下的 Word 文件,而不会处理 .docx 文件。 readLines() 也不是正确的解决方案;它需要纯 ASCII 文本作为输入。
  • 如果您将word文档保存为html,然后使用网络抓取包(例如XMLRCurl)提取文本怎么办?
  • 感谢您的建议。我从来没有做过网络抓取,尽管它在我的学习清单上。也许这就是我学习它的动力。
  • 您是否尝试过使用 Google Docs 对原始 pdf 进行 OCR?还有其他免费的在线 OCR 服务不需要安装软件。

标签: r ms-word


【解决方案1】:

首先,readLines() 不是正确的解决方案,因为 Word 文件不是文本(即纯 ASCII 文本)文件。

tm 包中的 Word 相关函数称为 readDOC(),但它和所需的第三方工具 (Antiword) 都适用于较旧的 Word 文件 (直到 Word 2003),并且无法使用较新的 .docx 文件。

我能建议的最好的方法是尝试 readPDF(),它也可以在 tm 包中找到。注意:它要求您的系统上安装了 pdftotext 工具。对 Linux 来说很容易,对 Windows 不了解。或者,找到将 PDF 转换为纯 ASCII 文本文件(不是 Word 文件)的 Windows 工具 - 它们应该在 Windows 上使用记事本正确打开和显示 - 然后尝试 readLines() 再次。但是,鉴于您的 PDF 文件较旧且来自扫描仪,转换为文本可能会很困难。

最后:我意识到您并没有在这种情况下做出最初的决定,但对于其他任何人 - Word 和 PDF 不是存储您要解析的数据的合适格式。

【讨论】:

  • 我认为这是一个合理的答案,尽管我认为最后一句话很重要,我会把它放在第一位。
  • 我将把最后一句话改写为:“Word 和 PDF 是适合存储任何内容的格式。永远。”微软因发布无法读取旧文件格式(Excel4.0,有人知道吗?)的 Office 版本而臭名昭著,而 PDF 则令人讨厌。 ASCII 和 epub(只是压缩的 XML)是更好的选择。
  • 由于这个非常古老的答案最近受到关注,我要指出......它非常古老,现在可能有替代方案。例如,Word .docx 基本上是一个 XML 文件的压缩文件夹,因此可以使用 XML 工具进行处理。
【解决方案2】:

如果它对其他人有帮助,https://cran.r-project.org/web/packages/readtext/vignettes/readtext_vignette.html,似乎有一个专门用于读取文本数据的新包,包括 Word 文件(也是新的.docx 格式)。

【讨论】:

    【解决方案3】:

    我还没有弄清楚如何将 MSWord 文件读入 R,但我已经将内容转换为 R 可以读取的格式。

    1. 我使用 Acrobat X Pro 将 pdf 转换为 MSWord

    2. 原始表格使用实心垂直线分隔列。事实证明,当我将 MSWord 文件转换为文本文件时,这些垂直线破坏了数据的格式,但我能够在创建文本文件之前从 MSWord 文件中删除这些行。

    3. 在步骤 2 中删除垂直线后,将 MSWord 文件转换为文本文件。

    4. 生成的文本文件仍需要大量编辑,但至少数据大部分以 R 可以读取的格式存在,我不必手动重新输入 pdf 中的所有数据,从而节省大量工作时间.

    【讨论】:

    • 一个更好的选择:让你的一个研究生为你做这件事。当然,这只适用于你是教授而不是学生的情况:-)
    【解决方案4】:

    您可以使用 RDCOMClient 轻松完成此操作。 这么说,有些字符将无法正确读入。

    require(RDCOMClient)
    # Create the connection
    wordApp <- COMCreate("Word.Application")
    # Let's set visible to true so you can see it run
    wordApp[["Visible"]] <- TRUE
    
    # Define the file we want to open
    wordFileName <- "c:/path/to/word/doc.docx"
    # Open the file
    doc <- wordApp[["Documents"]]$Open(wordFileName)
    # Print the text
    print(doc$range()$text()) 
    

    【讨论】:

    • 当我尝试此代码时,我收到错误 Exception occurredobject doc not foundsetwd('C:/Users/markm/simple R programs'); require(RDCOMClient); wordApp &lt;- COMCreate("Word.Application"); wordApp[["Visible"]] &lt;- TRUE; wordFileName &lt;- "C:/Users/markm/simple R programs/My_test_MSWord_file.docx"; doc &lt;- wordApp[["Documents"]]$Open(wordFileName); print(doc$range()$text());
    • 马克,你确定你的文件位置正确吗?我只能通过定义一个无效的文件位置来模拟这个问题。
    • 尝试将路径包含在 normalizePath 例如wordFileName &lt;- normalizePath("C:/Users/markm/simple R programs/My_test_MSWord_file.docx");
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2011-03-09
    • 2016-01-06
    • 2012-12-26
    • 2013-12-09
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多