Java数据科学指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-24 12:33:13

点击下载

作者:(加)鲁什迪·夏姆斯(Rushdi Shams)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java数据科学指南

Java数据科学指南试读:

前言

当今,数据科学是一个专业化的热门领域,它涵盖人工智能的各个方面,比如数据处理、信息检索、机器学习、自然语言处理、大数据、深度神经网络、数据可视化。在本书中,我们将讲解数据科学领域中既流行又智能的技术,这些技术分散在全书各个章节中,涉及70多个问题。

请记住,目前各个领域对高级数据科学家的需求是非常旺盛的,我们主要使用Java编写了本书各个章节,包括那些使用Java编写的著名的、经典的、最新的数据科学库。首先我们介绍数据采集与清洗流程,而后了解一下如何对所获取的数据建立索引以及进行检索。随后,我们讲解数据的统计描述、统计推断及其应用。接着,安排两个连续的章节讲解面向数据的机器学习应用,这些内容是创建智能系统的基础。除此之外,所讲解的内容还包括现代信息检索与自然语言处理技术。大数据是一个新兴的热门领域,本书内容会涉及其中几个方面。并且,我们还会讲解使用深度神经网络进行深度学习的基础知识。最后,我们学习如何使用有意义的视觉方式或图形表示数据以及从数据中获取的信息。

本书面向的读者是那些对数据科学感兴趣,或者打算应用Java数据科学技术来进一步理解底层数据的朋友。本书内容安排

第1章 “获取数据与清洗数据”,介绍各种读写数据的方法,以及对数据进行清洗去除其中噪声的方法。本章所涉及的数据文件类型广为人知,比如PDF、ASCII、CSV、TSV、XML、JSON。此外,本章还介绍用来提取Web数据的方法。

第2章 “为数据建立索引与搜索数据”,讲解如何使用Apache Lucene为数据建立索引以实现快速检索。本章介绍的技术是现代搜索技术的基础。

第3章 “数据统计分析”,讲解应用Apache Math API进行数据收集乃至分析统计指标的内容。本章还包含一些高级概念,比如统计显著性检验这一标准的工具,科研人员可以通过它将得到的结果与基准数据进行比较。

第4章 “数据学习Ⅰ”,包含使用Weka机器学习库进行分类、聚类、特征选择的内容。

第5章 “数据学习Ⅱ”,本章是前一章的后续内容,讲解使用另一个Java库——Java-ML库进行数据导入导出、分类、特征选择的内容。本章还包含使用斯坦福分类器(Stanford Classifier)与MOA(Massive Online Access)进行基本分类的内容。

第6章 “从文本数据提取信息”,介绍对文本数据应用数据科学技术以提取信息的方法。内容涉及Java核心应用以及OpenNLP、Stanford CoreNLP、Mallet、Weka等著名的机器学习库,学习如何使用它们来完成信息提取与检索任务。

第7章 “处理大数据”,本章涵盖机器学习大数据平台应用的内容,比如Apache Mahout、Spark-MLib。

第8章 “数据深度学习”,包含使用DL4j库进行深度学习的基础内容,介绍word2vec算法、信念网络与自动编码器。

第9章 “数据可视化”,讲解如何使用GRAL包为数据生成具有吸引力的信息展示图表。这个包功能众多,我们只讲解其中最基础的绘图功能。阅读本书需要具备的知识

在本书中,我们使用Java来解决各种实际的数据科学问题。对于那些想了解如何使用Java解决问题的朋友,本书所讲解的内容正是他们所需要的。阅读本书需要你具备最基本的Java知识,比如懂得Java类、对象、方法、实参与形参、异常、导出JAR文件等内容。书中给出的代码都配有相应的讲解、介绍以及提示,这有助于各位读者更好地理解它们。对于书中所解决问题的背后原理,大部分我们都不会进行详细讲解,但必要时我们会提供相应的参考内容,以供感兴趣的读者进一步学习。本书的目标读者

如果你想了解如何使用Java解决现实世界中与数据科学相关的问题,那么本书正是为你准备的。在内容覆盖方面,由于本书内容涵盖数据科学的方方面面,因此对于那些正在从事数据学习相关工作,并寻求使用Java解决项目问题的朋友而言,本书也具有十分重要的参考价值。结构安排

在本书中,你将经常看到如下几个标题:“准备工作”“操作步骤”“工作原理”“更多内容”“另见”。

对于本书的每一节内容,我们会使用如下几个小标题来组织相关内容。准备工作

本部分指出学习本节内容需要做的准备,也包含安装一些必需软件或做一些预先设置的内容。操作步骤

本部分包含跟学中要做的具体步骤。工作原理

本部分通常讲解与前一部分内容相关的更多细节。更多内容

本部分讲解与前面内容相关的更多知识,通过阅读本部分内容,让读者掌握更多相关知识。另见

本部分提供了一些有用的页面链接,从中读者可以获取更多与当前主题相关的有用内容。本书使用说明

在本书中,在不同类型的信息之间,你将看到大量不同的文本类型。下面给出了这些类型的一些示例,并对它们所代表的含义进行了说明。

正文中出现的代码用语、数据表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入、推特标签显示如下:“在它们之间,你会发现一个名为lib的文件夹,它就是感兴趣的文件夹。”

代码块设置如下: classVals = new ArrayList(); for (int i = 0; i < 5; i++){ classVals.add("class" + (i + 1)); }

命令行输入或输出写成如下形式:@relation MyRelation @attribute age numeric @attribute name string @attribute dob date yyyy-MM-dd @attribute class {class1,class2,class3,class4,class5} @data 35,'John Doe',1981-01-20,class3 30,'Harry Potter',1986-07-05,class1

正文中的新术语与关键词以粗体形式标识出来。你在屏幕截图中看到的词,比如在菜单或对话框中,出现在正文中的形式如下:“从Administration面板选择System info”。警告或重要注释出现在这里提示与技巧出现在这里第1章获取数据与清洗数据

本章涵盖如下内容:● 使用Java从分层目录中提取所有文件名;● 使用Apache Commons IO从分层目录中提取所有文件名;● 使用Java 8同时从多个文本文件读取内容;● 使用Apache Commons IO同时从多个文本文件读取内容;● 使用Apache Tika提取PDF文本;● 使用正则表达式清洗ASCII文本文件;● 使用Univocity解析CSV(逗号分隔)文件;● 使用Univocity解析TSV(制表符分隔)文件;● 使用JDOM解析XML文件;● 使用JSON.simple编写JSON文件;● 使用JSON.simple读取JSON文件;● 使用JSoup从一个URL地址提取Web数据;● 使用Selenium Webdriver从一个网站提取Web数据;● 从MYSQL数据库读取表格数据。1.1 简介

每个数据科学家都需要处理存储在磁盘中的数据,这些数据涉及的格式有ASCII文本、PDF、XML、JSON等。此外,数据还可以存储在数据库表格中。在对数据进行分析之前,数据科学家首先要做的是从这些数据源获取各种格式的数据,并对这些数据进行清洗,去除其中的噪声。本章我们将学习这些内容,即了解如何从不同数据源获取各种格式的数据。

在这一过程中,我们将用到外部Java库(Java归档文件,简称JAR文件),这些库的使用不仅限于本章,还贯穿于整本书。这些库由不同开发者或组织开发,方便了大家的使用。编写代码时,我们会用到Eclipse IDE工具,它是Windows平台下最好的集成开发环境,全书都会使用它。接下来,我们将讲解如何导入任意一个外部JAR文件,以下各个部分将指导你把外部JAR文件导入到项目中,跟随步骤动手去做即可。

对于一个Eclipse项目,你可以采用如下方法添加JAR文件:首先依次单击“Project|Build Path|Configure Build Path”,在Libraries选项卡中,单击“Add External JARs”,选择你想添加到项目的外部JAR文件,如图1-1所示。图1-11.2 使用Java从分层目录中提取所有文件名

这部分内容(以及后面各部分内容)是为那些想从复杂目录结构中提取文件路径与名称的数据科学家准备的,以方便进一步进行后续分析。这里的复杂目录结构是指在一个根目录下包含大量目录与文件。准备工作

开始之前,需要做如下准备工作。

1.创建复杂的目录结构(目录层数你自己决定)。

2.在其中一些目录中创建文本文件,而在另一些目录中留空。操作步骤

1.首先编写一个static方法,即listFiles(File rootDir),它带有一个File类型的参数,该参数可以是根目录或起始目录。这个方法将返回一系列文件,这些文件存在于参数所指定的根目录(以及其他所有下级子目录)中。 public static Set listFiles(File rootDir) {

2.然后,创建一个HashSet对象,用来包含文件信息。 Set fileSet = new HashSet();

3.在创建好HashSet对象之后,要检查参数指定的根目录及其子目录是否为null。当为null时,直接把HashSet对象返回即可,不需要进行进一步处理。 if (rootDir == null || rootDir.listFiles() == null){ return fileSet; }

4.接着,检查根目录中的每个目录(或文件),判断它是文件还是目录。如果是文件,就把它添加到HashSet中;如果是一个目录,就递归地调用本方法,并把当前目录路径与名称传递给它。 for (File fileOrDir : rootDir.listFiles()) { if (fileOrDir.isFile()){ fileSet.add(fileOrDir); } else{ fileSet.addAll(listFiles(fileOrDir)); } }

5.最后,把HashSet返回给该方法的调用者。 return fileSet; }

listFiles(File rootDir)方法的完整代码如下,包含执行该方法所需要的类与驱动方法。import java.io.File;import java.util.HashSet;import java.util.Set;public class TestRecursiveDirectoryTraversal { public static void main(String[] args){ System.out.println(listFiles(new File("Path for root directory")).size()); } public static Set listFiles(File rootDir) { Set fileSet = new HashSet(); if(rootDir == null || rootDir.listFiles()==null){ return fileSet; } for (File fileOrDir : rootDir.listFiles()) { if (fileOrDir.isFile()){ fileSet.add(fileOrDir); } else{ fileSet.addAll(listFiles(fileOrDir)); } } return fileSet; }}请注意,代码中的HashSet用来存储文件路径与名称。这意味着我们不会有任何重复项,这是因为Java中的Set这种数据结构不包含重复项。1.3 使用Apache Commons IO从多层目录中提取所有文件名

你可以使用前面一部分演示的操作步骤,采用递归方法把多层目录中的文件名列出来。除此之外,我们还有另外一种更简单、更方便的方法来完成它,那就是使用Apache Commons IO,并且只需编写少量代码即可。准备工作

开始之前,需要做如下准备。

1.本部分会用到一个名称为Commons IO的Java库,它来自于Apache基金会。全书中,我们会使用Commons IO 2.5版本,请从Commons官网下载JAR文件。

2.在Eclipse中,把下载的JAR文件包含到你的项目中(作为外部JAR文件)。操作步骤

1.创建listFiles方法,它带有一个参数,用来指定层级目录的根目录。 public void listFiles(String rootDir){

2.创建一个文件对象,并把根目录名传递给它。 File dir = new File(rootDir);

3.Apache Commons库的FileUtils类中包含一个名称为listFiles()方法。使用这个方法提取所有文件名,并且把它们放入一个带有泛型的列表变量中。使用TrueFileFilter.INSTANCE来匹配所有目录。 List files = (List) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);

4.我们可以像下面这样把文件名显示在标准输出中。由于我们把文件名放入了一个列表之中,所以我们可以通过某种方法对这些文件中的数据进行进一步处理。 for (File file : files) { System.out.println("file: " + file.getAbsolutePath()); }

5.关闭方法。 }

完整代码包括方法代码、类代码,以及驱动方法,如下所示:import java.io.File;import java.util.List;import org.apache.commons.io.FileUtils;import org.apache.commons.io.filefilter.TrueFileFilter; public class FileListing{ public static void main (String[] args){ FileListing fileListing = new FileListing(); fileListing.listFiles("Path for the root directory here"); } public void listFiles(String rootDir){ File dir = new File(rootDir); List files = (List) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE); for (File file : files) { System.out.println("file: " + file.getAbsolutePath()); } }如果你想把带有一些特定扩展名的文件列出来,还可以使用Apache Commons库中的listFiles方法。但是这个方法的参数有些不同,它拥有3个参数,分别为文件目录、扩展名(String[])、递归与否。在这个库中还有一个有趣的方法,即listFilesAndDirs(File directory, IOFileFilter fileFilter, IOFileFilter dirFilter),如果你想把文件与目录全部列出来,可以使用它。1.4 使用Java 8从文本文件一次性读取所有内容

在许多场合下,数据科学家所拥有的数据是文本格式的。我们有很多方法可以用来读取文本文件的内容,这些方法各具优缺点:一些方法执行起来耗时、耗内存,而另一些方法执行速度很快,也不需要消耗太多计算机内存;一些方法可以把全部文本内容一次性读出,而另一些方法则只能一行行地读取文本文件。至于到底要选择哪种方法,则取决于你所面对的任务,以及你决定采用何种方法来处理这个任务。

在这部分中,我们将演示使用Java 8把文本文件的全部内容一次性读出来的方法。操作步骤

1.首先,创建一个String对象,用来保存待读取的文本文件的目录与名称。 String file = "C:/dummy.txt";

2.使用Paths类的get()方法,可以得到待读文件的路径。get()方法的参数是String对象,用来指定文件名,它的输出作为lines()方法的输入。lines()方法包含于Files类之中,用来读取一个文件的所有行,并且返回Stream,也就是说,这个方法的输出定向到一个Stream变量。因为我们的dummy.txt文件中包含字符串数据,所以把Stream变量的泛型设置为String。

整个读取过程需要放入一个try...catch块中,用来应对读取过程中可能发生的异常,比如当试图读取的文件不存在或已损坏时,就会抛出异常。

下面代码用来把dummy.txt文件中的内容全部显示出来。在stream变量中包含着文本文件的所有行,所以需要使用它的forEach()方法显示出每行内容。 try (Stream stream = Files.lines(Paths.get(file))) { stream.forEach(System.out::println); } catch (IOException e) { System.out.println("Error reading " + file.getAbsolutePath()); }1.5 使用Apache Commons IO从文本文件一次性读取所有内容

在上一节中我们学习了使用Java8从文本文件中一次性读取所有内容,其实我们也可以使用Apache Commons IO API一次性读取文本文件的所有内容。准备工作

开始之前,需要做如下准备。

1.本部分,我们会用到一个名为Apache Commons IO的Java库。

2.在Eclipse中,把下载好的JAR文件包含到你的项目中。操作方法

1.假设你要读取的文件为dummy.txt,它位于C:/目录之下。首先,需要创建一个文件对象,用来访问这个文件,如下所示: File file = new File("C:/dummy.txt");

2.接着,创建一个字符串对象,用来保存文件中的文本内容。这里我们要使用readFileToString()方法,它来自于Apache Commons IO库,是FileUtils类的一个成员方法。调用这个方法的方式有很多,但是现在,你只需知道我们要传递两个参数给它,第一个参数是file对象,用来指定要读取的文件,第二个参数是文件的编码,在示例中,我们将其设置为UTF-8。 String text = FileUtils.readFileToString(file, "UTF-8");

3.只要使用上面两行代码,我们就可以读取文本文件内容,并将它们存入一个String变量中。但是,你可不是一个普通的数据科学家,你比其他人要聪明得多。所以,你在上面两行代码的前后又添加了几行代码,用来处理Java方法抛出的异常,比如你试图读取的文件不存在或者已经损坏,就会触发异常。为此,我们需要把上面两行代码放入到一个try...catch块之中,如下所示: File file = new File("C:/dummy.txt"); try { String text = FileUtils.readFileToString(file, "UTF-8"); } catch (IOException e) { System.out.println("Error reading " + file.getAbsolutePath()); }1.6 使用Apache Tika提取PDF文本

在解析与提取数据时,最难搞的文件类型之一是PDF文件。有些PDF文件甚至无法解析,因为它们有密码保护,而其他一些则包含着扫描的文本与图像。所以,这种动态文件类型有时会成为数据科学家的梦魇。本部分演示如何使用Apache Tika从PDF文件提取文本,当然前提是PDF文件没有被加密,也没有密码保护,而只包含非扫描的文本。准备知识

开始之前,需要先做如下准备。

1.下载Apache Tika 1.10 JAR文件,并且将其作为外部Java库包含到你的Eclipse项目中。

2.把任意一个未锁定的PDF文件保存到C:/目录之下,并且命名为testPDF.pdf。操作步骤

1.创建一个名称为convertPdf(String)的方法,它带有一个字符串参数,用来指定PDF文件名称。 public void convertPDF(String fileName){

2.创建一个输入流,用来以字节流的形式包含PDF数据。 InputStream stream = null;

3.创建一个try块,如下所示: try{

4.把文件指派给刚刚创建好的stream。 stream = new FileInputStream(fileName);

5.在Apache Tika包中包含着许多不同的解析器。如果你不知道该选用哪一个,或者说你还有其他类型的文档需要转换,那么你应该使用AutoDetectParser解析器,如下所示: AutoDetectParser parser = new AutoDetectParser();

6.创建一个handler,用来处理文件的正文内容。请注意,创建时需要把构造函数的参数设为-1。通常,Apache Tika会对处理的文件进行限制,要求它至多包含100 000个字符。使用-1让这个handler忽略这个限制。 BodyContentHandler handler = new BodyContentHandler(-1);

7.创建一个metadata对象。 Metadata metadata = new Metadata();

8.调用解析器对象的parser()方法,并把上面创建的这些对象传递给它。 parser.parse(stream, handler, metadata, new ParseContext());

9.使用handler对象的tostring()方法,获取从文件中提取的正文文本。 System.out.println(handler.toString());

10.关闭try块,并且添加catch与finally块。最后,关闭整个方法,如下所示: }catch (Exception e) { e.printStackTrace(); }finally { if (stream != null) try { stream.close(); } catch (IOException e) { System.out.println("Error closing stream"); } } }

下面代码包含convertPdf(String)方法的完整代码,以及相应的类与驱动方法。在调用convertPdf(String)方法时,你需要提供待转换的PDF文件的路径与名称,即把该方法的参数指定为C:/testPDF.pdf。import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.tika.metadata.Metadata;import org.apache.tika.parser.AutoDetectParser;import org.apache.tika.parser.ParseContext;import org.apache.tika.sax.BodyContentHandler;public class TestTika { public static void main(String args[]) throws Exception { TestTika tika = new TestTika(); tika.convertPdf("C:/testPDF.pdf"); } public void convertPdf(String fileName){ InputStream stream = null; try { stream = new FileInputStream(fileName); AutoDetectParser parser = new AutoDetectParser(); BodyContentHandler handler = new BodyContentHandler(-1); Metadata metadata = new Metadata(); parser.parse(stream, handler, metadata, new ParseContext()); System.out.println(handler.toString()); }catch (Exception e) { e.printStackTrace(); }finally { if (stream != null) try { stream.close(); } catch (IOException e) { System.out.println("Error closing stream"); } } }}1.7 使用正则表达式清洗ASCII文本文件

ASCII文本文件中通常会包含一些非必要的字符,这些字符通常产生于转换过程中,比如把PDF转换为文本或把HTML转换为文本的过程中。并且,这些字符常常被看作噪声,它们是数据处理的主要障碍之一。本部分,我们学习使用正则表达式为ASCII文本数据清洗一些噪声的方法。操作步骤

1.创建一个名为cleanText(String)的方法,它带有一个String类型的参数,用来指定要清洗的文本。 public String cleanText(String text){

2.在你的方法中,添加如下几行代码,而后把清洗后的文本返回,并关闭方法。在如下代码中,第一行代码用来去掉非ASCII字符,紧接的一行用来把连续的空格字符替换为单个空格字符。第三行用来清除所有ASCII控制字符。第四行用来去除ASCII非打印字符。最后一行用来从Unicode移除非打印字符。 text = text.replaceAll("[^p{ASCII}]",""); text = text.replaceAll("s+", " "); text = text.replaceAll("p{Cntrl}", ""); text = text.replaceAll("[^p{Print}]", ""); text = text.replaceAll("p{C}", ""); return text; }

以下代码是方法的完整代码,包含相应类与驱动方法。public class CleaningData { public static void main(String[] args) throws Exception { CleaningData clean = new CleaningData(); String text = "Your text here you have got from some file"; String cleanedText = clean.cleanText(text); //清洗文本处理 } public String cleanText(String text){ text = text.replaceAll("[^p{ASCII}]",""); text = text.replaceAll("s+", " "); text = text.replaceAll("p{Cntrl}", ""); text = text.replaceAll("[^p{Print}]", ""); text = text.replaceAll("p{C}", ""); return text; }}1.8 使用Univocity解析CSV文件

对数据科学家来说,另一种经常处理的文件格式是CSV(逗号分隔)文件,在这种文件中数据之间通过逗号进行分隔。CSV文件非常流行,因为大部分电子表格应用程序都可以读取它,比如MS Excel。

本部分,我们将学习解析CSV文件,以及处理所提取的数据点的方法。准备工作

开始之前,需要先做如下准备。

1.下载Univocity JAR文件,并将其作为外部库添加到你的Eclipse项目中。

2.使用Notepad创建一个CSV文件,它包含如下数据。创建好之后,把文件的扩展名修改为.csv,并把它保存到C盘之下,即C:/testCSV.csv。 Year,Make,Model,Description,Price 1997,Ford,E350,"ac, abs, moon",3000.00 1999,Chevy,"Venture ""Extended Edition""","",4900.00 1996,Jeep,Grand Cherokee,"MUST SELL! air, moon roof, loaded",4799.00 1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00 ,,"Venture ""Extended Edition""","",4900.00操作步骤

1.创建一个名为parseCsv(String)的方法,它带有一个String类型的参数,用来指定待解析的文件名。 public void parseCsv(String fileName){

2.而后创建一个配置对象,该对象用来提供多种配置选项。 CsvParserSettings parserSettings = new CsvParserSettings();

3.借助于配置对象,你可以打开解析器的自动检测功能,让它自动侦测输入中包含何种行分隔符序列。 parserSettings.setLineSeparatorDetectionEnabled(true);

4.创建一个RowListProcessor对象,用来把每个解析的行存储在列表中。RowListProcessor rowProcessor = new RowListProcessor();

5.你可以使用RowProcessor来配置解析器,以对每个解析行的值进行处理。你可以在com.univocity.parsers.common.processor包中找到更多RowProcessors,但是你也可以自己创建。 parserSettings.setRowProcessor(rowProcessor);

6.如果待解析的CSV文件包含标题头,你可以把第一个解析行看作文件中每个列的标题。 parserSettings.setHeaderExtractionEnabled(true);

7.接下来,使用给定的配置创建一个parser实例。 CsvParser parser = new CsvParser(parserSettings);

8.parser实例的parse()方法用来解析文件,并把每个经过解析的行指定给前面定义的RowProcessor。 parser.parse(new File(fileName));

9.如果解析中包含标题,则可使用如下代码获取这些标题。 String[] headers = rowProcessor.getHeaders();

10.随后,你可以很容易地处理这个字符串数组,以获取这些标题值。

11.另一方面,我们在列表中可以找到行值。只要使用一个for循环即可把列表打印出来,如下所示。 List rows = rowProcessor.getRows(); for (int i = 0; i < rows.size(); i++){ System.out.println(Arrays.asList(rows.get(i))); }

12.最后,关闭方法。 }

整个方法的完整代码如下所示:import java.io.File;import java.util.Arrays;import java.util.List;import com.univocity.parsers.common.processor.RowListProcessor;import com.univocity.parsers.csv.CsvParser;import com.univocity.parsers.csv.CsvParserSettings;public class TestUnivocity { public void parseCSV(String fileName){ CsvParserSettings parserSettings = new CsvParserSettings(); parserSettings.setLineSeparatorDetectionEnabled(true); RowListProcessor rowProcessor = new RowListProcessor(); parserSettings.setRowProcessor(rowProcessor); parserSettings.setHeaderExtractionEnabled(true); CsvParser parser = new CsvParser(parserSettings); parser.parse(new File(fileName)); String[] headers = rowProcessor.getHeaders(); List rows = rowProcessor.getRows(); for (int i = 0; i < rows.size(); i++){ System.out.println(Arrays.asList(rows.get(i))); } } public static void main(String[] args){ TestUnivocity test = new TestUnivocity(); test.parseCSV("C:/testCSV.csv"); } }有很多采用Java编写的CSV解析器。但是,相比较而言,Univocity是执行速度最快的一个。1.9 使用Univocity解析TSV文件

不同于CSV文件,TSV(制表符分隔)文件中所包含的数据通过TAB制表符进行分隔。本部分,我们将学习使用Univocity从TSV文件提取数据点的方法。准备工作

开始之前,先做如下准备工作。

1.下载Univocity JAR文件,并将其作为外部库包含到你的Eclipse项目中。

2.使用Notepad创建一个TSV文件,它包含如下数据。创建好之后,把文件的扩展名修改为.tsv,并把它保存到C盘之下,即C:/testTSV.tsv。Year Make Model Description Price1997 Ford E350 ac, abs, moon 3000.001999 Chevy Venture "Extended Edition" 4900.001996 Jeep Grand Cherokee MUST SELL!nair, moon roof, loaded 4799.001999 Chevy Venture "Extended Edition, Very Large" 5000.00 Venture "Extended Edition" 4900.00操作步骤

1.创建一个名称为parseTsv(String)的方法,它带有一个String类型的参数,用来指定待解析的文件名。 public void parseTsv(String fileName){

2.本部分中TSV文件的行分隔符为换行符或n。为了把字符n设置为行分隔符,修改设置如下所示。 settings.getFormat().setLineSeparator("n");

3.使用这些设置,创建一个TSV解析器。 TsvParser parser = new TsvParser(settings);

4.使用如下代码,把TSV文件中的所有行一次性解析出来。 List allRows = parser.parseAll(new File(fileName));

5.遍历列表对象,打印或处理数据行,代码如下所示。 for (int i = 0; i < allRows.size(); i++){ System.out.println(Arrays.asList(allRows.get(i))); {

6.最后,关闭方法。 }

下面代码中包含整个方法的完整代码,以及相应类与驱动方法。import java.io.File;import java.util.Arrays;import java.util.List;import com.univocity.parsers.tsv.TsvParser;import com.univocity.parsers.tsv.TsvParserSettings;public class TestTsv { public void parseTsv(String fileName){ TsvParserSettings settings = new TsvParserSettings(); settings.getFormat().setLineSeparator("n"); TsvParser parser = new TsvParser(settings); List allRows = parser.parseAll(new File(fileName)); for (int i = 0; i < allRows.size(); i++){ System.out.println(Arrays.asList(allRows.get(i))); } }}1.10 使用JDOM解析XML文件

通常,文本数据是没有结构的,不同于文本数据,在XML文件中的数据是具有结构的。XML是组织数据的一种流行方式,借助它,我们可以非常方便地准备、传递以及利用数据。有很多方法可以用来解析XML文件的内容。本书中,我们将学习使用一个名为JDOM的Java库来解析XML文件。准备工作

开始之前,先做如下准备工作。

1.下载JDOM 2.06版本(JAR文件)。

2.在Eclipse中,创建一个项目,并把上面下载的JAR文件作为外部JAR文件包含进去。

3.打开notepad,新建一个名称为dummyxml的文件,文件扩展名为.xml,文件包含的内容简单如下: Alice Peterson John Doe 操作步骤

1.创建一个名称为builder的SAXBuilder对象。 SAXBuilder builder = new SAXBuilder();

2.接下来,你需要创建一个File对象,用来指向待解析的XML文件。如果你已经把XML文件保存到C盘之下,则将其放入如下代码片段中。 File file = new File("c:/dummyxml.xml");

3.在try语句块中,需要创建一个Document对象,它表示你的XML文件。 try { Document document = (Document) builder.build(file);

4.在解析呈现树状结构的XML文件时,需要知道文件的根元素,以便开始遍历整个树(换言之,开始进行系统的解析)。因此,需要创建一个Element类型的rootNode对象,用来保存根元素,在我们的示例中,它对应于节点。 Element rootNode = document.getRootElement();

5.接着,获取根节点下所有名称为author的子节点。由于调用getChildren()方法所得到的是子节点列表,所以还需要有一个列表变量来存储它们。 List list = rootNode.getChildren("author");

6.然后,使用for循环遍历整个子节点列表,以获取列表中的项目元素。每个元素都存储在Element类型的node变量中。这个变量有一个名称为getChildText()的方法,其参数为子元素名称,返回子元素的文本内容,如果指定的子元素不存在,就返回null。这个方法用起来非常方便,因为调用getChild().getText()可能会抛出NullPointerException异常。 for (int i = 0; i < list.size(); i++) { Element node = (Element) list.get(i); System.out.println("First Name : " + node.getChildText("firstname")); System.out.println("Last Name : " + node.getChildText("lastname")); }

7.最后,关闭try语句块,并添加如下catch语句块处理可能遇到的异常。 } catch (IOException io) { System.out.println(io.getMessage()); } catch (JDOMException jdomex) { System.out.println(jdomex.getMessage()); }

完整代码如下:import java.io.File;import java.io.IOException;import java.util.List;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;public class TestJdom { public static void main(String[] args){ TestJdom test = new TestJdom(); test.parseXml("C:/dummyxml.com"); } public void parseXml(String fileName){ SAXBuilder builder = new SAXBuilder(); File file = new File(fileName); try { Document document = (Document) builder.build(file); Element rootNode = document.getRootElement(); List list = rootNode.getChildren("author"); for (int i = 0; i < list.size(); i++) { Element node = (Element) list.get(i); System.out.println("First Name : " + node.getChildText("firstname")); System.out.println("Last Name : " + node.getChildText("lastname")); } } catch (IOException io) { System.out.println(io.getMessage()); } catch (JDOMException jdomex) { System.out.println(jdomex.getMessage()); } }}XML解析器类型多样,每种解析器都各有优点。Dom Parser。这种解析器会把文档的完整内容加载到内存中,并在内存中创建自己的层次树。SAX Parser:这种解析器不会把整个文档全部加载到内存中,文档的解析基于事件触发。JDOM Parser:JDOM解析器采用类似DOM解析器的方式解析文档,但是更加便捷。StAX Parser:这种解析器采用类似于SAX解析器的方式处理文档,但是效率更高。XPath Parser:这类解析器基于路径表达式来解析文档,经常与XSLT一起使用。DOM4J Parser:这是一个使用Java集合框架(该框架提供了对DOM、SAX、JAXP的支持)来解析XML、XPath、XSLT的Java库。1.11 使用JSON.simple编写JSON文件

类似于XML文件,JSON也是一种人类可读的轻量级数据交换格式。JSON是JavaScript Object Notation(JavaScript对象表示法)的首字母缩写。JSON正成为一种由现代Web应用程序所生成与解析的流行格式。本部分中,我们将学习如何编写JSON文件。准备工作

开始之前,先做如下准备工作。

下载json-simple-1.1.1.jar,并将其作为外部库添加到你的Eclipse项目中。操作步骤

1.创建一个名称为writeJson(String outFileName)的方法,它带有一个String类型参数,用来指定要生成的JSON文件名。本节我们将创建它,并与JSON信息一起输出。

2.创建一个JSON对象,使用它的put()方法,添加几个字段,比如图书与作者。下面代码用来创建一个JSON对象,然后添加书名及其作者名字。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载