精华内容
下载资源
问答
  • 导读:本文的目标是介绍一些Python库,帮助你从类似于...我们还将学习如何从不同来源提取原始文本,进行规范化,并基于它创建一个用户定义的语料库。在本文中,你将学习7个不同的实例。我们将学习从PDF文件、W...

    导读:本文的目标是介绍一些Python库,帮助你从类似于PDF和Word DOCX 这样的二进制文件中提取数据。我们也将了解和学习如何从网络信息源(web feeds)(如RSS)中获取数据,以及利用一个库帮助解析HTML文本并从文档中提取原始文本。

    我们还将学习如何从不同来源提取原始文本,对其进行规范化,并基于它创建一个用户定义的语料库。

    在本文中,你将学习7个不同的实例。我们将学习从PDF文件、Word文档和Web中获取数据。PDF和Word文档是二进制文件,通过Web,你将获得HTML格式的数据,因此,我们也会对数据执行规范化和原始文本转换任务。

    作者:克里希纳·巴夫萨、纳雷什·库马尔、普拉塔普·丹蒂

    如需转载请联系大数据(ID:hzdashuju)

    aed337ae73e5913bed467c733bf5608c.png

    01 字符串操作的重要性

    作为一名NLP专家,你将要处理大量的文本内容。当你在处理文本时,你必须知道一些字符串操作。我们将从几个简短的范例入手,帮助你理解str类及其在Python中的相关操作。

    1. 准备工作

    这里,你仅仅需要Python解释器和一个文本编辑器。我们将使用join(连接)、split(分割)、addition(加法)和multiplication(乘法)运算符以及索引。

    2. 如何实现

    (1)创建一个新的Python文件,命名为StringOps1.py。

    (2)定义以下两个对象:

    namesList = ['Tuffy','Ali','Nysha','Tim' ]sentence = 'My dog sleeps on sofa'

    第一个对象nameList是一个包含若干名字的字符串列表,第二个对象sentence是一个包含一句话的字符串对象。

    (3)首先,我们看看join函数的特点以及它的功能:

    names = ';'.join(namesList)print(type(names), ':', names)

    join()函数可以被任意一个string对象调用,它的输入参数是一个str对象的列表。通过将调用字符串的内容作为连接分隔符,它将所有str对象连接成一个str对象,并返回连接后的对象。运行这两行代码后,你得到的输出如下:

     : Tuffy;Ali;Nysha;Tim

    (4)接下来,我们来看split方法的功能:

    wordList = sentence.split(' ')print((type(wordList)), ':', wordList)

    当split函数调用一个字符串时,它会将其内容分割为多个str对象,创建一个包含这些字符串对象的列表,并返回该列表。该函数接受单个str对象作为参数,表示分隔符。运行代码,得到如下输出:

     : ['My', 'dog', 'sleeps', 'on', 'sofa']

    (5)算术运算符+和*也可以用于字符串。添加以下代码并输出:

    additionExample = 'ganehsa' + 'ganesha' + 'ganesha'multiplicationExample = 'ganesha' * 2print('Text Additions :', additionExample)print('Text Multiplication :', multiplicationExample)

    我们首先看一下输出结果,随后讨论其工作原理:

    Text Additions: ganehsaganeshaganeshaText Multiplication: ganeshaganesha

    +运算符被称为连接符,它将字符串连接为单个str对象,产生一个新的字符串。如前所述,我们也可以使用*运算符对字符串做乘法。此外,需要注意的是这些操作不会添加任何额外的内容,例如在字符串之间插入空格。

    (6)接下来,我们来了解一下字符串中的字符索引。添加下列几行代码:

    str = 'Python NLTK'print(str[1])print(str[-3])

    首先,我们声明一个新的 string 对象。然后可以直接访问字符串中的第二个字符(y)。这里还有个小技巧:Python允许你在访问任何列表对象时使用负索引,比如说-1意味着最后一个成员,-2是倒数第二个成员,依此类推。例如,在前面代码的str对象中,索引7和-4是相同的字符N:

    Output:  : Tuffy;Ali;Nysha;Tim : ['My', 'dog', 'sleeps', 'on', 'sofa']Text Additions : ganehsaganeshaganeshaText Multiplication : ganeshaganeshay L

    3. 工作原理

    我们使用split()函数将一个字符串变成了一个字符串列表,并使用join()函数将一个字符串列表变成了一个字符串。接下来我们了解了有关字符串的一些算术运算符的用法。

    需要注意的是,我们不能在字符串中使用“-”(负号)和“/”(除法)运算符。最后,我们了解了如何在任一字符串中访问单个字符,特别值得一提的是,我们可以在访问字符串时使用负索引。

    本段实例非常简单和直观,主要是介绍Python允许的一些常见和不常见的字符串操作。接下来,我们将在以上操作基础上继续学习一些字符串操作。

    02 深入实践字符串操作

    接下来,我们将了解子字符串、字符串替换以及如何访问一个字符串的所有字符。

    1. 如何实现

    (1)创建一个新的Python文件,命名为StringOps2.py并定义以下string对象:

    str = 'NLTK Dolly Python'

    (2)访问str对象中以第四个字符作为结束的子串。

    print('Substring ends at:',str[:4])

    我们知道索引从零开始,因此将返回由第0个到第3个字符组成的子串。运行代码,输出如下:

    Substring ends at: NLTK

    (3)访问str对象中从某个点开始直到末尾的子串:

    print('Substring starts from:',str[11:] )

    以上代码指示解释器返回str对象中从索引11到结束的一个子串。运行代码,得到以下输出:

    Substring starts from: Python

    (4)从str对象中访问包含Dolly的子串。添加以下行:

    print('Substring :',str[5:10])

    以上代码返回从索引5到10的字符,不包括第10个字符。输出是:

    Substring : Dolly

    (5)我们在前一段中已经了解了负索引在字符串操作中的应用。现在我们试试看它在获取子串中的作用:

    print('Substring fancy:', str[-12:-7])Run and check the output, it will be –Substring fancy: Dolly

    这里得到的输出与上一步完全相同!为了理解这个结果,我们做一些计算:-1表示最后一个字符,-2是倒数第二个字符,依此类推。你将会发现[5:10]和[-12:-7]在这个例子中得出的子串是相同的。

    (6)了解in操作符在if语句中的用法:

    if 'NLTK' in str: print('found NLTK')

    运行以上代码,程序的输出如下所示:

    found NLTK

    如上所示,in操作符会检查左边的字符串是否属于右边字符串的子串。

    (7)了解str对象中replace函数的使用:

    replaced = str.replace('Dolly', 'Dorothy')print('Replaced String:', replaced)

    replace函数只需要两个参数。第一个是需要被替换的子字符串,第二个是用来替换前面子字符串的新子字符串。replace函数返回一个新的string对象,并且它不会修改调用它的字符串,运行代码,有如下输出:

    Replaced String: NLTK Dorothy Python

    (8)最后,迭代上面得到的replaced对象并访问它的每一个字符:

    print('Accessing each character:')for s in replaced: print(s)

    以上操作每次在新的一行输出replaced对象的每个字符,最终输出如下:

    Output: Substring ends at: NLTKSubstring starts from: PythonSubstring : DollySubstring fancy: Dollyfound NLTKReplaced String: NLTK Dorothy PythonAccessing each character:NL T K D o r o t h y P y t ho n

    2. 工作原理

    字符串对象只是一个字符列表。正如第一步所示,我们可以像访问一个列表那样用for语句来访问字符串中的每个字符。任何列表的方括号内的字符“:”表示我们想要的一个子列表。

    方括号内,如果字符“:”之后是一个数字n,表示我们希望获得一个从列表索引0开始到索引n-1结束的子列表。同样地,一个数字m后跟着字符“:”,则表示我们想要一个从列表索引m开始到列表末尾的子列表。

    03 在Python中读取PDF文件

    这个实例是从Python中访问PDF文件。首先,你需要安装PyPDF2库。

    1. 准备工作

    假设你已经安装了pip。然后,在Python2或Python3版本上用pip安装PyPDF2库,你只需要在命令行中运行以下命令:

    pip install pypdf2

    如果你成功安装了PyPDF2库,就完成了准备工作。与此同时,你需要通过以下链接下载一些我们将在本段用到的测试文档:

    https://www.dropbox.com/sh/bk18dizhsu1p534/AABEuJw4TArUbzJf4Aa8gp5Wa?dl=0

    2. 如何实现

    (1)创建一个新的Python文件,命名为pdf.py并添加以下代码:

    from PyPDF2 import PdfFileReader

    这行代码会导入PyPDF2库中的PdfFileReader类。

    (2)在上面创建的文件中添加如下Python函数,它的功能是读取一个PDF文件并返回其全文:

    def getTextPDF(pdfFileName, password = '')

    该函数需要两个参数,一个是你要读取的PDF文件路径,一个是这个PDF文件的密码(如果有的话)。可见,password 参数是可选的。

    (3)现在我们来定义这个函数。在该函数下添加如下代码:

    pdf_file = open(pdfFileName, 'rb')read_pdf = PdfFileReader(pdf_file)

    第一行代码会以读取和反向查找模式打开文件。第一行本质是一个Python文件打开命令/函数,仅能打开非文本的二进制文件。第二行将打开的文件传递给PdfFileReader类,用于处理PDF文档。

    (4)如果文件设置了密码保护,接下来是解密被密码保护的PDF文件:

    if password != '':read_pdf.decrypt(password)

    如果在函数调用时设置了密码,那么我们在解密这个文件时也同样需要密码。

    (5)从PDF文件中读取文本:

    text = []for i in range(0,read_pdf.getNumPages()-1):text.append(read_pdf.getPage(i).extractText())

    创建一个字符串列表,并将每一页的文本都添加到这个列表中。

    (6)返回最终的输出结果:

    return ''.join(text)

    将列表中所有的字符串都连接起来,并且在每个字符串之间都加一个换行符,返回连接后的单一字符串。

    (7)在pdf.py目录下创建另一个名为TestPDFs.py 的文件,添加以下导入语句:

    import pdf

    (8)现在我们打印输出两个文档中的文本,其中一个是受密码保护的,一个是未加密的:

    pdfFile = 'sample-one-line.pdf'pdfFileEncrypted = 'sample-one-line.protected.pdf'print('PDF 1: ',pdf.getTextPDF(pdfFile))print('PDF 2: ',pdf.getTextPDF(pdfFileEncrypted,'tuffy'))

    输出:本实例的前六步只是创建了一个Python函数,并不向控制台输出内容,第七和第八步会输出以下内容:

    This is a sample PDF document I am using to demonstrate in thetutorial.This is a sample PDF documentpassword protected.

    3. 工作原理

    PyPDF2是用于提取PDF文件内容的一个纯Python库。该库有很多功能,可用于裁剪页面、叠加图像数字签名、创建新的PDF文件等。但是,对NLP工程师需要实现的文本分析任务来说,该库只用来读取内容。

    在第二步中,以反向查找模式打开文件很重要,因为当加载文件内容时,PyPDF2模块试图从尾部开始读取文件内容。此外,如果PDF文件是受密码保护的,而你没有在访问文件前解密文件,Python解释器将抛出一个PdfReadError错误。

    04 在Python中读取Word文件

    这里,我们将学习如何加载和读取Word/DOCX文档。用于读取Word/DOCX文件的相关库会更加全面,在这些库中我们还可以处理段落边界、文本样式以及对所谓的run对象的操作。我们将会了解以上提到的所有内容,因为这些内容在文本分析任务中是至关重要的。

    Tip: 如果你没有安装Microsoft Word软件,你可以使用Liber Office和Open Office软件的开源版本来创建和编辑“.docx”文件。

    1. 准备工作

    假设你已经在你的机器上安装了pip,我们将使用pip来安装python-docx库。不要将它与另一个名为docx的库混淆,这是两个完全不同的库。我们将从python docx库中导入docx对象。在命令行中执行下面的命令将安装这个库:

    pip install python-docx

    成功安装了该库后,继续下一步,我们将在这个实例中使用一个测试文档,如果你已经通过本文第一段提供的链接下载了所有文档,你应该已具备相关文档。如果没有,请从以下链接下载sample-one-line.docx文档。

    https://www.dropbox.com/sh/bk18dizhsu1p534/AABEuJw4TArUbzJf4Aa8gp5Wa?dl=0

    现在,准备工作就全部完成了。

    2. 如何实现

    (1)创建一个新的Python文件,命名为word.py并添加以下导入代码:

    import docx

    这里只需导入python-docx模块的docx对象。

    (2)定义getTextWord函数:

    def getTextWord(wordFileName):

    该函数需要一个字符串参数wordFileName,包含你要读取的Word文件的绝对路径。

    (3)初始化doc 对象:

    doc = docx.Document(wordFileName)

    此时doc对象加载了你要读取的Word文件。

    (4)接下来我们要从已经加载文档的doc对象中读取文本,添加以下代码来实现:

    fullText = []for para in doc.paragraphs: fullText.append(para.text)

    首先初始化一个字符串列表fullText,然后采用for循环逐段从文档中读取文本,并把每段都放到fullText列表中去。

    (5)然后,我们将所有的片段/段落连接为一个字符串对象,并将其作为函数的输出结果返回:

    return ''.join(fullText)

    通过以上操作,我们将fullText数组的所有元素用“ n”分隔符连接起来,并返回连接后的对象。最后保存该Python文件并退出。

    (6)创建另一个Python文件,命名为TestDocX.py,并添加以下导入声明:

    import docximport word

    这里只需导入docx库以及我们在前五步中实现的word.py文件。

    (7)现在我们将要读取一个DOCX文件并使用我们在word.py中实现的API打印输出它的全部内容。添加以下两行代码:

    docName = 'sample-one-line.docx'print('Document in full :',word.getTextWord(docName))

    首先在第一行代码中初始化文档的路径,然后使用API打印输出文档的全部内容。当你运行这部分代码时,得到以下输出:

    Document in full :

    这是一个带有一些粗体文本、一些斜体文本和一些下划线文本的PDF示例文档。我们还嵌入了一个标题,如下所示:

    This is my TITLE.This is my third paragraph.

    (8)正如前面提到的,Word / DOCX文档是一个更加丰富的信息来源,除了提供文本内容外,还能提供很多信息。现在我们来看有关段落的信息。添加以下四行代码:

    doc = docx.Document(docName)print('Number of paragraphs :',len(doc.paragraphs))print('Paragraph 2:',doc.paragraphs[1].text)print('Paragraph 2 style:',doc.paragraphs[1].style)

    以上代码的第二行打印出了给定文档中段落的数量。第三行打印出了文档中第二段的内容。而第四行将会打印出第二段的样式,比如在这个例子中的样式就是Title类型。当你运行以上代码后,输出将如下所示:

    Number of paragraphs : 3Paragraph 2: This is my TITLE.Paragraph 2 style: _ParagraphStyle('Title') id: 4374023248

    (9)接下来,我们将了解什么是run对象。添加以下代码:

    print('Paragraph 1:',doc.paragraphs[0].text)print('Number of runs in paragraph 1:',len(doc.paragraphs[0].runs))for idx, run in enumerate(doc.paragraphs[0].runs): print('Run %s : %s' %(idx,run.text))

    首先,我们获得文档第一段的全部内容。然后,我们获得第一段中run对象的数目。最后,我们把每个run对象打印输出。

    (10)为了明确每个run对象的格式,添加以下代码:

    print('is Run 0 underlined:',doc.paragraphs[0].runs[5].underline)print('is Run 2 bold:',doc.paragraphs[0].runs[1].bold)print('is Run 7 italic:',doc.paragraphs[0].runs[3].italic)

    这段代码的各行分别在检查相应run对象的下划线样式、粗体样式以及斜体样式。最终输出如下:

    Output: Document in full :This is a sample PDF document with some text in BOLD, some inITALIC and some underlined. We are also embedding a Title downbelow.This is my TITLE.This is my third paragraph.Number of paragraphs : 3Paragraph 2: This is my TITLE.Paragraph 2 style: _ParagraphStyle('Title') id: 4374023248Paragraph 1: This is a sample PDF document with some text in BOLD,some in ITALIC and some underlined. We're also embedding a Titledown below.Number of runs in paragraph 1: 8Run 0 : This is a sample PDF document withRun 1 : some text in BOLDRun 2 : ,Run 3 : some in ITALICRun 4 : andRun 5 : some underlined.Run 6 : We are also embedding a Title down belowRun 7 : .is Run 0 underlined: Trueis Run 2 bold: Trueis Run 7 italic: True

    3. 工作原理

    首先,我们在word.py文件中写了一个函数,它将读取给定的DOCX文件并返回一个包含文件全部内容的字符串对象。前面的输出内容大都是不需要解释的,我特别阐述了关于Paragraph和Run的输出内容。DOCX文件的结构可以用python-docx库的三个数据类型来表示,其中最高一级是Document对象。

    每个文档都包含多个段落。文档中出现新的一行或一个回车,就表示开始一个新的段落。每个段落用多个Run对象表示段落内格式的变化,这里的格式包含有字体、尺寸、颜色和其他样式元素(如粗体、斜体、下划线等等)。这些元素每次发生变化时,都会创建一个新的Run对象。

    05 使用PDF、DOCX和纯文本文件,创建用户自定义的语料库

    现在我们要创建自己的语料库,而不是使用从互联网上得到的语料库。

    1. 准备工作

    在准备方面,我们将使用本文第一个实例中提到的Dropbox文件夹中的几个文件。如果你已经从那个文件夹中下载了全部的文件,那么你已经完成了准备工作。否则,请从

    https://www.dropbox.com/sh/bk18dizhsu1p534/AABEuJw4TArUbzJf4Aa8gp5Wa?dl=0

    下载如下文件:

    • sample_feed.txt
    • sample-pdf.pdf
    • sample-one-line.docx

    如果你没有按照本文的顺序来完成实例,那么你需要先回头看看本文的前两个实例。我们将用到本文前两个实例中完成的两个模块 word.py和pdf.py。本段实例更多是关于本文前两个实例所做工作的应用以及语料库概念的应用。下面我们来看实际的代码。

    2. 如何实现

    (1)创建一个新的Python文件,命名为createCorpus.py并添加以下代码:

    import osimport word, pdffrom nltk.corpus.reader.plaintext import PlaintextCorpusReader

    我们导入os库用于与文件有关的操作,word库和pdf库是本文前两段完成的库,最后导入的PlaintextCorpusReader是为了完成语料库建立这一最终目标。

    (2)编写一个简单的函数,用来打开并读取一个纯文本文件,并将其全部内容作为string对象返回。添加以下代码:

    def getText(txtFileName): file = open(txtFileName, 'r') return file.read()

    第一行代码定义了函数及其输入参数。第二行代码以只读方式打开文件(open函数的第二个参数r表示以只读方式打开)。第三行代码读取打开文件的内容并将其作为string对象返回。

    (3)在磁盘或文件系统中创建一个新文件夹corpus。添加以下三行代码:

    newCorpusDir = 'mycorpus/'if not os.path.isdir(newCorpusDir): os.mkdir(newCorpusDir)

    第一行定义的string对象包含了新文件夹名,第二行检查该文件夹在磁盘或文件系统中是否存在,第三行则通过执行os.mkdir()函数在磁盘上创建一个给定名字的文件夹。以上代码执行后将在你的Python文件所在的工作目录下创建一个名为mycorpus的新文件夹。

    (4)然后,逐个读取前面提到的三个文件。首先从纯文本文件开始,添加以下代码:

    txt1 = getText('sample_feed.txt')

    调用之前完成的getText函数,它将读取Sample_feed.txt文件并将输出结果存入名为txt1的字符串对象中。

    (5)现在,添加以下代码来读取PDF文件:

    txt2 = pdf.getTextPDF('sample-pdf.pdf')

    这里使用了PDF.py模块的getTextPDF()函数,它将读取sample-pdf.pdf文件并将文件内容存入名为txt2的字符串对象中。

    (6)最后,通过以下代码读取DOCX文件:

    txt3 = word.getTextWord('sample-one-line.docx')

    这里使用了word.py模块的getTexWord()函数,它将读取sample-one-line.docx文件并将文件内容存入名为txt3的字符串对象中。

    (7)接下来,将上面读到的三个字符串对象写到磁盘文件中。添加以下代码:

    files = [txt1,txt2,txt3]for idx, f in enumerate(files): with open(newCorpusDir+str(idx)+'.txt', 'w') as fout: fout.write(f)
    • 第一行:创建一个包含以上三个字符串对象的数组
    • 第二行:使用for循环来遍历files数组
    • 第三行:以只写模式打开一个新文件(采用w选项调用open函数)
    • 第四行:将当前字符串内容写到文件中

    (8)在mycorpus目录下,也就是我们之前存放文件的目录下新建一个PlainTextCorpus对象:

    newCorpus = PlaintextCorpusReader(newCorpusDir, '.*')

    以上一行代码看似简单,但是它在内部做了很多的文本处理,如识别段落、句子、单词等等。该函数的两个参数分别是语料库目录的路径以及要处理的文件名模式(这里我们已经设置corpus reader可以处理该目录下所有的文件)。通过以上步骤,我们创建了一个用户自定义的语料库。

    (9)接下来,我们来看PlainTextCorpusReader是否加载正常。添加以下代码来进行测试:

    print(newCorpus.words())print(newCorpus.sents(newCorpus.fileids()[1]))print(newCorpus.paras(newCorpus.fileids()[0]))

    第一行代码将打印输出语料库包含的所有单词数组(部分)。第二行代码将打印输出文件1.txt中的句子。第三行代码将打印输出文件0.txt中的段落:

    Output: ['Five', 'months', '.', 'That', "'
    展开全文
  • 今天,又熬夜优化了一下代码,现在,可以做到从Excel一键提取Oracle数据库iKB汇总数据进行数据分析及完成自动化日报了。 可以说,自动化程度已经相当之高了。 分享代码: Sub initialize() '声明定义VB...

    作为一个consultant,其价值就在于做一个problem solver,解决具体问题。

    自己写程序的好处就是,对细节的把控程度更高,更容易实现精益求精。

    今天,又熬夜优化了一下代码,现在,可以做到从Excel一键提取Oracle数据库iKB汇总数据,进行数据分析及完成自动化日报了。

    可以说,自动化程度已经相当之高了。

    分享代码:

    Sub initialize()
    
    '声明定义VBA语句中需要使用到的各个变量类型
    Dim AdoConn As New ADODB.Connection '定义变量AdoConn为连接数据库对象(ADODB是数据库访问组件,Connection是其中的一个对象),用于实现连接数据库连接等操作
    Dim D1 As Date                      '定义D1为日期型变量,用于业务日期赋值
    Dim D2 As Date                      '定义D2为日期型变量,用于业务日期赋值
    Dim i As Integer                    '定义i为循环变量,用于初始化时基于数据库数据循环赋值
    
    '定义SQL语句所需要的4个字符串变量
    Dim strSQL1 As String
    Dim strSQL2 As String
    Dim strSQL3 As String
    Dim strSQL4 As String
    
    i = 2                               '表头占用一行,数据从第二行开始
    
    
    '需在工程中手动添加引用:工具-引用-Microsoft ActiveX Data Objects 2.8 'Library,Microsoft ActiveX Data Objects Recordset 2.8 Library
    '建立数据库连接
    'AdoConn.Open ("provider=msdaora; data source=orcl; user id=C##SCOTT;password=scott") 'Oracle 12.1.0.2.0-64 版本+Excel2016专业增强版,使用此种连接方式不可行
    AdoConn.Open ("provider=OraOLEDB.Oracle.1; data source=orcl; user id=C##SCOTT;password=scott")
    
    
    '从第二行开始循环赋值
    Do While ActiveSheet.Cells(i, "B").Value <> ""
        D1 = ActiveSheet.Cells(i, "B")
        D2 = D1 + 1
    
        '设置SQL查询语句
        strSQL1 = "SELECT count(termid) FROM ikb"                                '当日词条总数
        strSQL2 = "SELECT count(distinct phase) FROM ikb"      'Phase词条数(去重不为空,下同)
        strSQL3 = "SELECT count(distinct type) FROM ikb"       'type词条数
        strSQL4 = "SELECT count(distinct subtype) FROM ikb"    'subtype词条数
        strSQL5 = "SELECT count(termid) FROM ikb WHERE date_updated < to_date('" & D2 & "') AND date_updated >= to_date('" & D1 & "')"              '更新日期为该日期的词条总数
        strSQL6 = "SELECT count(distinct en) FROM ikb"         'EN词条数
        strSQL7 = "SELECT count(distinct cn) FROM ikb"         'CN词条数
        strSQL8 = "SELECT count(distinct jp) FROM ikb"         'JP词条数
        strSQL9 = "SELECT count(distinct ed) FROM ikb"         'ed词条数
        strSQL10 = "SELECT count(distinct cnd) FROM ikb"       'cnd词条数
        strSQL11 = "SELECT count(distinct jpd) FROM ikb"        'jpd词条数
        
        '执行查询并赋值
        ActiveSheet.Cells(i, 12).CopyFromRecordset AdoConn.Execute(strSQL1)
        ActiveSheet.Cells(i, 3).CopyFromRecordset AdoConn.Execute(strSQL2)
        ActiveSheet.Cells(i, 4).CopyFromRecordset AdoConn.Execute(strSQL3)
        ActiveSheet.Cells(i, 5).CopyFromRecordset AdoConn.Execute(strSQL4)
        ActiveSheet.Cells(i, 13).CopyFromRecordset AdoConn.Execute(strSQL5)
        ActiveSheet.Cells(i, 6).CopyFromRecordset AdoConn.Execute(strSQL6)
        ActiveSheet.Cells(i, 7).CopyFromRecordset AdoConn.Execute(strSQL7)
        ActiveSheet.Cells(i, 8).CopyFromRecordset AdoConn.Execute(strSQL8)
        ActiveSheet.Cells(i, 9).CopyFromRecordset AdoConn.Execute(strSQL9)
        ActiveSheet.Cells(i, 10).CopyFromRecordset AdoConn.Execute(strSQL10)
        ActiveSheet.Cells(i, 11).CopyFromRecordset AdoConn.Execute(strSQL11)
    
        
        i = i + 1
    Loop
    
    
    AdoConn.Close
    
    Set AdoConn = Nothing
    
    MsgBox "数据提取完毕!"
    
    End Sub
    
    
    Sub update()
    
    '声明定义VBA语句中需要使用到的各个变量类型
    Dim AdoConn As New ADODB.Connection '定义变量AdoConn为连接数据库对象(ADODB是数据库访问组件,Connection是其中的一个对象),用于实现连接数据库连接等操作
    Dim D1 As Date                      '定义D1为日期型变量,用于业务日期赋值
    Dim D2 As Date                      '定义D2为日期型变量,用于业务日期赋值
    Dim N As Integer
    'Dim i As Integer                    '定义i为循环变量,用于初始化时基于数据库数据循环赋值
    
    '定义SQL语句所需要的4个字符串变量
    Dim strSQL1 As String
    Dim strSQL2 As String
    Dim strSQL3 As String
    Dim strSQL4 As String
    Dim strSQL5 As String
    Dim strSQL6 As String
    Dim strSQL7 As String
    Dim strSQL8 As String
    Dim strSQL9 As String
    Dim strSQL10 As String
    Dim strSQL11 As String
    
    
    D1 = Date
    D2 = D1 + 1
    
    
    
    '需在工程中手动添加引用:工具-引用-Microsoft ActiveX Data Objects 2.8 'Library,Microsoft ActiveX Data Objects Recordset 2.8 Library
    '建立数据库连接
    'AdoConn.Open ("provider=msdaora; data source=orcl; user id=C##SCOTT;password=scott") 'Oracle 12.1.0.2.0-64 版本+Excel2016专业增强版,使用此种连接方式不可行
     'AdoConn.Open ("provider=OraOLEDB.Oracle.1; data source=orcl; user id=C##SCOTT; password=scott")
     'AdoConn.Open ("Driver={Microsoft ODBC for Oracle}; server=orcl; user id=C##SCOTT; password=scott")
     AdoConn.Open ("provider=OraOLEDB.Oracle.1; data source=orcl; user id=C##SCOTT;password=scott")
     
    '      Dim conn As New ADODB.Connection
    '      'Dim rs As ADODB.Recordset
    '      Dim strConn As String
    '      'Dim strconn1 As String
    '      Set conn = CreateObject("ADODB.Connection")
    '      'Set rs = CreateObject("ADODB.recordset")
    '      strConn = "Driver=D:\app\client\pande\product\12.1.0\client_1\oledb\lib\OraOLEDB12.lib;Dbq=orcl;Uid=C##SCOTT;Pwd=scott;" 'OraClient11g_home1为oracle安装目录,Dbq为数据库名
    '     conn.Open strConn '打开数据库
    
    N = ActiveSheet.Range("B1").End(xlDown).Row + 1 '获取下一业务日期
    
        If (ActiveSheet.Cells(N - 1, 2) < Date) Then            '最新一条记录对应的业务日期小于系统日期时,新增记录
       
            '设置SQL查询语句
            strSQL1 = "SELECT count(termid) FROM ikb"                                '当日词条总数
            strSQL2 = "SELECT count(distinct phase) FROM ikb"      'Phase词条数(去重不为空,下同)
            strSQL3 = "SELECT count(distinct type) FROM ikb"       'type词条数
            strSQL4 = "SELECT count(distinct subtype) FROM ikb"    'subtype词条数
            strSQL5 = "SELECT count(termid) FROM ikb WHERE date_updated < to_date('" & D2 & "') AND date_updated >= to_date('" & D1 & "')"              '更新日期为该日期的词条总数
            strSQL6 = "SELECT count(distinct en) FROM ikb"         'EN词条数
            strSQL7 = "SELECT count(distinct cn) FROM ikb"         'CN词条数
            strSQL8 = "SELECT count(distinct jp) FROM ikb"         'JP词条数
            strSQL9 = "SELECT count(distinct ed) FROM ikb"         'ed词条数
            strSQL10 = "SELECT count(distinct cnd) FROM ikb"       'cnd词条数
            strSQL11 = "SELECT count(distinct jpd) FROM ikb"        'jpd词条数
            
            '执行查询并赋值
            ActiveSheet.Cells(N, 1).Value = ActiveSheet.Cells(N - 1, 1).Value + 1
            ActiveSheet.Cells(N, 2).Value = ActiveSheet.Cells(N - 1, 2).Value + 1
            ActiveSheet.Cells(N, 12).CopyFromRecordset AdoConn.Execute(strSQL1)
            ActiveSheet.Cells(N, 3).CopyFromRecordset AdoConn.Execute(strSQL2)
            ActiveSheet.Cells(N, 4).CopyFromRecordset AdoConn.Execute(strSQL3)
            ActiveSheet.Cells(N, 5).CopyFromRecordset AdoConn.Execute(strSQL4)
            ActiveSheet.Cells(N, 13).CopyFromRecordset AdoConn.Execute(strSQL5)
            ActiveSheet.Cells(N, 6).CopyFromRecordset AdoConn.Execute(strSQL6)
            ActiveSheet.Cells(N, 7).CopyFromRecordset AdoConn.Execute(strSQL7)
            ActiveSheet.Cells(N, 8).CopyFromRecordset AdoConn.Execute(strSQL8)
            ActiveSheet.Cells(N, 9).CopyFromRecordset AdoConn.Execute(strSQL9)
            ActiveSheet.Cells(N, 10).CopyFromRecordset AdoConn.Execute(strSQL10)
            ActiveSheet.Cells(N, 11).CopyFromRecordset AdoConn.Execute(strSQL11)
            ActiveSheet.Cells(N, 14).Value = ActiveSheet.Cells(N, 12).Value - ActiveSheet.Cells(N - 1, 12).Value
            ActiveSheet.Cells(N, 15).Value = ActiveSheet.Cells(N, 13).Value - ActiveSheet.Cells(N - 1, 13).Value
            ActiveSheet.Cells(N, 16).Value = ActiveSheet.Cells(N, 14).Value + ActiveSheet.Cells(N - 1, 16).Value
        End If
    
    
        If (ActiveSheet.Cells(N - 1, 2) = Date) Then                '最新一条记录对应的业务日期等于系统日期时,仅更新最后一条记录 (即,刷新当前数据)
       
            '设置SQL查询语句
            strSQL1 = "SELECT count(termid) FROM ikb"                                '当日词条总数
            strSQL2 = "SELECT count(distinct phase) FROM ikb"      'Phase词条数(去重不为空,下同)
            strSQL3 = "SELECT count(distinct type) FROM ikb"       'type词条数
            strSQL4 = "SELECT count(distinct subtype) FROM ikb"    'subtype词条数
            strSQL5 = "SELECT count(termid) FROM ikb WHERE date_updated < to_date('" & D2 & "') AND date_updated >= to_date('" & D1 & "')"              '更新日期为该日期的词条总数
            strSQL6 = "SELECT count(distinct en) FROM ikb"         'EN词条数
            strSQL7 = "SELECT count(distinct cn) FROM ikb"         'CN词条数
            strSQL8 = "SELECT count(distinct jp) FROM ikb"         'JP词条数
            strSQL9 = "SELECT count(distinct ed) FROM ikb"         'ed词条数
            strSQL10 = "SELECT count(distinct cnd) FROM ikb"       'cnd词条数
            strSQL11 = "SELECT count(distinct jpd) FROM ikb"        'jpd词条数
            
            '执行查询并赋值
            ActiveSheet.Cells(N - 1, 12).CopyFromRecordset AdoConn.Execute(strSQL1)
            ActiveSheet.Cells(N - 1, 3).CopyFromRecordset AdoConn.Execute(strSQL2)
            ActiveSheet.Cells(N - 1, 4).CopyFromRecordset AdoConn.Execute(strSQL3)
            ActiveSheet.Cells(N - 1, 5).CopyFromRecordset AdoConn.Execute(strSQL4)
            ActiveSheet.Cells(N - 1, 13).CopyFromRecordset AdoConn.Execute(strSQL5)
            ActiveSheet.Cells(N - 1, 6).CopyFromRecordset AdoConn.Execute(strSQL6)
            ActiveSheet.Cells(N - 1, 7).CopyFromRecordset AdoConn.Execute(strSQL7)
            ActiveSheet.Cells(N - 1, 8).CopyFromRecordset AdoConn.Execute(strSQL8)
            ActiveSheet.Cells(N - 1, 9).CopyFromRecordset AdoConn.Execute(strSQL9)
            ActiveSheet.Cells(N - 1, 10).CopyFromRecordset AdoConn.Execute(strSQL10)
            ActiveSheet.Cells(N - 1, 11).CopyFromRecordset AdoConn.Execute(strSQL11)
            ActiveSheet.Cells(N - 1, 14).Value = ActiveSheet.Cells(N - 1, 12).Value - ActiveSheet.Cells(N - 2, 12).Value
            ActiveSheet.Cells(N - 1, 15).Value = ActiveSheet.Cells(N - 1, 13).Value - ActiveSheet.Cells(N - 2, 13).Value
            ActiveSheet.Cells(N - 1, 16).Value = ActiveSheet.Cells(N - 1, 14).Value + ActiveSheet.Cells(N - 2, 16).Value
        End If
    
    AdoConn.Close
    
    Set AdoConn = Nothing
    
    MsgBox "数据提取完毕!"
    
    End Sub
    
    

     

    更新数据页面:

     

    报表正文页面:

     

    展开全文
  • 函数作用:选定的数组进行排序.....................76 '56.函数作用:取得指定月份天数.........................77 '57.函数作用:排序工作表活页薄.........................77 '58.函数作用:统计数组中非重复数据...
  • 实例135 数据库数据进行局部删除 236 3.24 视图 237 实例136 动态创建视图 237 实例137 通过视图更改数据 238 实例138 删除视图 240 3.25 触发器 241 实例139 创建触发器 241 实例140 在程序中使用触发器 ...
  • 实例135 数据库数据进行局部删除 236 3.24 视图 237 实例136 动态创建视图 237 实例137 通过视图更改数据 238 实例138 删除视图 240 3.25 触发器 241 实例139 创建触发器 241 实例140 在程序中使用触发器 ...
  • 提取多行文字中的文字内容AutoCAD中多行文字的格式代码进行了分析。使用ObjectDBX实现的批量文字替换,与上一个版本比较起来,修正了一些Bug,并且是在不打开文件的情况下完成操作的,速度有了明显的提高。 第6章...
  • Access 2007 VBA宝典 1/4

    2012-03-31 08:12:09
     Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...
  • Access 2007 VBA宝典 4/4

    2012-03-31 08:36:49
     Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...
  • Access 2007 VBA宝典 2/4

    2012-03-31 08:22:16
     Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...
  • Access 2007 VBA宝典 3/4

    2012-03-31 08:31:46
     Access从一开始(大约14年前)就是一个关系型数据库程序,它在表中存储数据,并使用自己的查询、窗体和报表对数据进行排序、筛选、显示和打印。随着Office版本的升级,在Office组件(特别是Word、Excel和Outlook)...
  • 文本文件数据绑定,数据源没有个数限制,可以添加多个数据进行数据显示,咖啡智能报表不是简单的进行数据填充显示, 具有强大的数据处理能力,例如:数据格式自动处理,根据数据自动分组统计,复杂交叉报表处理...
  • 报表数据来源丰富,支持绑定与非绑定,数据源既支持拉模式又支持推模式:设定报表的 OLE DB 数据源连接串与查询SQL,报表在运行时自动从数据提取数据。也可以在报表取数事件中提供报表明细数据,编程工具中所有...
  • ★ 支持标签管理、定位和标签文字更改 由于系统强大的前后台数据交互功能,所以能够做到在打开Word,Excel文件的状态下,根据需要从服务器数据库中提取相关数据,替换标签处的文字内容,所以,能够做到在指定位置显示...
  • 14、支持列表、搜索页面对数据记录进行实时排序、修改、批量删除等功能 15、支持表头/单独表格搜索两种布局方式 16、提供多种灵活翻页方案,用户可设置每页记录条数、上/下页、前/后N页、输入数字跳转到指定页面等,...
  • 风越ASP代码生成器 2.4

    2009-05-26 21:22:40
    14、支持列表、搜索页面对数据记录进行实时排序、修改、批量删除等功能 15、支持表头/单独表格搜索两种布局方式 16、提供多种灵活翻页方案,用户可设置每页记录条数、上/下页、前/后N页、输入数字跳转到指定页面等,...
  • 14、支持列表、搜索页面对数据记录进行实时排序、修改、批量删除等功能 15、支持表头/单独表格搜索两种布局方式 16、提供多种灵活翻页方案,用户可设置每页记录条数、上/下页、前/后N页、输入数字跳转到指定页面等,...
  • 14、支持列表、搜索页面对数据记录进行实时排序、修改、批量删除等功能 15、支持表头/单独表格搜索两种布局方式 16、提供多种灵活翻页方案,用户可设置每页记录条数、上/下页、前/后N页、输入数字跳转到指定页面等,...
  • 风越ASP代码生成器2.8

    2010-03-12 12:10:47
    14、支持列表、搜索页面对数据记录进行实时排序、修改、批量删除等功能 15、支持表头/单独表格搜索两种布局方式 16、提供多种灵活翻页方案,用户可设置每页记录条数、上/下页、前/后N页、输入数字跳转到指定页面等,...
  • 实例044 利用CallByName函数对象进行操作 实例045 打印住宿登记 第3章 数组与指针 3.1 数组的引用与算法 实例046 如何获取数组上限和下限 实例047 如何在数组中插入数组元素 实例048 如何删除数组元素 实例...
  • 实例044 利用CallByName函数对象进行操作 实例045 打印住宿登记 第3章 数组与指针 3.1 数组的引用与算法 实例046 如何获取数组上限和下限 实例047 如何在数组中插入数组元素 实例048 如何删除数组元素 实例...
  • 137.选定的范围进行数据填充(忽略单元格格式) 138.VBA Project加密及解密 139.列出收藏夹中的网址 140.计算两个日期之间相隔的年份,比如年龄,工龄等.可计算从1000年01月01日起的日期 141.从字符串提取纯数字 142...
  • 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)对象 432 ...
  • 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)对象 432...
  • 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)对象 432 ...
  • 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)对象 432 ...
  • asp.net知识库

    2015-06-18 08:45:45
    使用Relations建立表之间的关系并却使用PagedDataSource类DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...
  • 10.9.1 用linq to sql提取数据:创建控制台应用程序 426 10.9.2 o/r设计器 427 10.9.3 创建product对象 428 10.10 对象到linq对象的映射 429 10.10.1 datacontext对象 430 10.10.2 table(tentity)...
  • VC下利用串口进行数据通讯的研究.pdf VC与MATLAB混合编程在图像处理中的应用.pdf VC与Matlab混合编程实现图像处理.pdf VC与Matlab混合编程实现成组图像边缘的连续提取.pdf VC与MATLAB混合编程实现方法及具体...
  • VC下利用串口进行数据通讯的研究.pdf VC与MATLAB混合编程在图像处理中的应用.pdf VC与Matlab混合编程实现图像处理.pdf VC与Matlab混合编程实现成组图像边缘的连续提取.pdf VC与MATLAB混合编程实现方法及具体...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

vb对excel数据进行提取