【问题标题】:How to import a text file without columns and with hard breaks into vba?如何将没有列且带有硬中断的文本文件导入vba?
【发布时间】:2014-05-27 16:49:15
【问题描述】:

我在 VBA 中构建了一个简单的网络爬虫,它从 Google 专利中提取一个表格,并将内部 HTML 存储在一个 .txt 文件(名称类似于 1234567.txt)中,用于大约 23,000 项专利。现在我要分析每个文件的内容。为此,我希望将 txt 文件导入 VBA,以便我可以进行一些字符串搜索,但这似乎非常困难。 我阅读了大约 20 种将 .txt 文件导入 VBA 的解决方案,但没有一个适用于我的文件,如下所示:

US6824791 B2 ' There is a shift + Enter here
<TD class="patent-data-table-td citation-patent"><A href="/patents/US7767249">US7767249</A></TD>
<TD class="patent-data-table-td patent-date-value">Jul 25, 2005</TD>
<TD class="patent-data-table-td patent-date-value">Aug 3, 2010</TD>
<TD class="patent-data-table-td ">Hewlett-Packard Development Company, L.P.</TD>
<TD class="patent-data-table-td ">Preparation of nanoparticles</TD></TR>
<TR>
<TD class="patent-data-table-td citation-patent"><A href="/patents/US7935853">US7935853</A><SPAN class=patent-tooltip-anchor aria-label="Cited by examiner" data-tooltip-text="Cited by examiner" data-tooltip="Cited by examiner" a="null"> *</SPAN></TD>
<TD class="patent-data-table-td patent-date-value">Oct 8, 2009</TD>
<TD class="patent-data-table-td patent-date-value">May 3, 2011</TD>
<TD class="patent-data-table-td ">Bobelium S.L.</TD>
<TD class="patent-data-table-td ">Micronized composition of a 2,4-disubstituted phenol derivative</TD></TR>
<TR>
<TD class="patent-data-table-td citation-patent"><A href="/patents/US8524829">US8524829</A></TD>
<TD class="patent-data-table-td patent-date-value">Jun 17, 2008</TD>
<TD class="patent-data-table-td patent-date-value">Sep 3, 2013</TD>
<TD class="patent-data-table-td ">Brown University Research Foundation</TD>
<TD class="patent-data-table-td ">Methods for micronization of hydrophobic drugs</TD></TR>
<TR>
<TD class="patent-data-table-td citation-patent"><A href="/patents/EP2422804A1?cl=en">EP2422804A1</A></TD>
<TD class="patent-data-table-td patent-date-value">Jun 16, 2005</TD>
<TD class="patent-data-table-td patent-date-value">Feb 29, 2012</TD>
<TD class="patent-data-table-td ">Amano Enzyme USA., Ltd.</TD>
<TD class="patent-data-table-td ">Controlled release formulations of enzymes, microorganisms, and antibodies with mucoadhesive polymers</TD></TR></TBODY></TABLE>
' There is a shift + Enter here

因此,尽管文件结构整齐且重复,但将它们作为单个字符串导入似乎非常困难。我基本上想遍历文件,提取专利号和提到的两个日期(使用MidInStr)并将它们放在三个不同的列中。这是我认为最好的方法,但我渴望听到更明智的建议!

知道每个 .txt 文件具有不同的长度(行数)可能是相关的,但我可以以 99.9% 的确定性估计确切的行数(1 (title) + 6 * total number of citations (which I know) - 1 (last &lt;TR&gt; is missing)

提前致谢

西蒙

编辑:我尝试过的一些例子。此代码取自在线资源。我不太确定它们应该如何工作,很可能是我错误地应用了它们。

`Sub Text2Excel_Click()
Dim sourcestring as String

sourcestring = GetText("C\users\...\test.txt")
sourcestring = OpenTextFileToString("C\users\...\test.txt")

Function GetText(sFile As String) As String
   Dim sText As String
   Dim nSourceFile As Integer

   ''Close any open text files
   Close
   ''Get the number of the next free text file
   nSourceFile = FreeFile
   ''Write the entire file to sText
   Open sFile For Input As #nSourceFile
   sText = Input$(LOF(1), 1)
   Close

   GetText = sText
End Function

Function OpenTextFileToString(ByVal strFile As String) As String
' RB Smissaert - Author
Dim hFile As Long
hFile = FreeFile
Open strFile For Input As #hFile
OpenTextFileToString = Input$(LOF(hFile), hFile)
Close #hFile
End Function

我还尝试了以下 suggestion: 但这给了我运行时错误 424“需要对象”。

【问题讨论】:

  • 我可以只取文本(在开始添加 &lt;TABLE&gt;&lt;TBODY&gt; 开始标签后 - 可能只是因为您只发布了一小部分数据而丢失),将其另存为.html 文件,然后使用 Excel 中的文件/打开将其导入标准电子表格。这不适合你吗?
  • 我展示了我拥有的所有数据。 和 在文件的收集中已被删除。不知道我会需要它们,所以我没有它们。保存为 html 并在 excel 中打开可能是可能的,但我不知道如何为 > 20.000 个文本文件执行此操作。为每个文件手动执行似乎不是一个明智的选择...
  • 所以你有很多 HTML 表格片段要从中提取数据。我仍然不完全确定您遇到了什么问题:该过程的哪一部分不起作用(实际上是打开文件,遍历行,查找数据)?您尝试过哪些 VBA 函数,结果如何?
  • 我只需要一个允许我将文件读入 vba 的函数。我认为这非常简单,但我似乎没有找到任何可行的解决方案。所以我将我给出的示例存储在 C:\Users\simon\Desktop\test.txt 下,我想将该文件读入 VBA 并将其命名为 sourcestring。所以我尝试了Dim sourcestring As String sourcestring = "C:\Users\simon\Desktop\test.txt" and 100 variants (with EOF and LOF) 之类的方法,但没有任何效果。有时我只得到第一行(可能是由于硬中断。通常我得到一个错误
  • 23,000 个文件?每个文件有多少引用?我认为您会使用 Open、Line Input 和 Close 读取文件,以便提取所需的字段。您的代码似乎没有提取任何数据。

标签: vba excel import


【解决方案1】:

如果您只是想将文本文件转换为 vba 中的 1 个字符串,那么您可以使用以下函数。

注意:这需要您添加对 Microsoft Scripting Runtime 的引用。

Public Function ReadFileAsString(ByVal filePath As String) As String

Dim fso As FileSystemObject
Set fso = New FileSystemObject
Set txtstream = fso.OpenTextFile(filePath, ForReading, False)

Dim sourceString As String
Do While Not txtstream.AtEndOfStream
    sourceString = sourceString + txtstream.ReadLine
Loop

ReadFileAsString = sourceString
txtstream.Close

Set fso = Nothing
Set txtstream = Nothing

End Function

然后你可以在上面函数返回的字符串上做 InStr() 和 Mid() 等。要查看文本文件,请尝试:

Public Sub Test()
    Debug.Print ReadFileAsString("C:\Users\ausername\Desktop\test.txt")
End Sub

【讨论】:

  • 你好。我尝试了您的解决方案,但它显然不起作用。我只得到文档的第一行(硬中断可能导致这种情况)并且每个字母之间都有一个空格......有什么方法可以让其余的也被阅读?
  • 假设您的意思是 Shift+Enter 用于硬休息,这对我有用。你是怎么用的?
  • 我的意思是 shift + enter ,这很奇怪。它对我不起作用。它实际上只给出了一个结果(我添加了MsgBox sourceString)看起来像 ypU 但 y 有一个变音符号,p 实际上是一个 p 和一个 b 在彼此之上,而 U 是一个正常的大写 U。这些符号都不是出现在文中。顺便说一句,我测试了一个没有 Shift + Enter 组合的文本,并且该文本运行良好。 PS 在文本的最后还有一个 Shift + Enter 组合,并且 Shift + Enter 的可视化是男性的符号 - 圆圈和向上箭头
  • 我不确定知道这些信息会有什么帮助,但你使用的是哪个版本的 excel?您的操作系统和默认语言是什么?
  • 再次感谢您的快速回复。我实际上认为它正在工作。我不是在开玩笑,但您的代码似乎不适用于我称为 test.txt 的文件(不知道为什么)。我尝试了其他一些很难进入的,它们确实工作得很好而且速度很快。但仅供参考,我使用的是 Excel 2010,Windows 7,默认为英国英语。但正如所说,我认为它有效。让我再进行几次试验,如果它成立,我将非常乐意接受您的回答。你救了你一命!
猜你喜欢
  • 2021-09-04
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2013-01-17
  • 1970-01-01
相关资源
最近更新 更多