2019独角兽企业重金招聘Python工程师标准>>>

简介

该系列主要总结了使用java处理数据过程中使用到的工具以及一些可以起到启发性的代码。通过本章节你可以学习到:

  • 如何递归遍历文件目录
  • 如何访问各种各样的数据源

1、遍历文件

1.1、使用基本方法列出目录下的所有文件

import java.io.File;
import java.util.HashSet;
import java.util.Set;public class ListFilesWithSimple {public static void main(String[] args) {// 1.使用java从分层目录中提取所有文件名Set<File> files = ListFilesWithSimple.listFiles(new File("D:/hadoop"));for (File file : files) {System.out.println(file.getPath());}}// 1. 从分层目录中提取所有文件名(注意不包含文件夹)public static Set<File> listFiles(File rootDir){Set<File> fileSet = new HashSet<File>();// when file is null or file is not a directory.if(rootDir == null || rootDir.listFiles() == null){return fileSet;}for (File file : rootDir.listFiles()) {if(file.isFile()){fileSet.add(file);}else{fileSet.addAll(listFiles(file));}}return fileSet;}
}

1.2、使用Apache Commons IO 从多层目录中提取所有文件

引入依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;import java.io.File;
import java.util.List;public class ListFilesWithCommonIo {public static void main(String[] args) {List<File> files = ListFilesWithCommonIo.listFiles(new File("D:/hadoop"));for (File file : files) {System.out.println(file.getAbsolutePath());}}public static List<File> listFiles(File rootDir){return (List<File>)FileUtils.listFiles(rootDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);// 若需要返回目录//return (List<File>)FileUtils.listFilesAndDirs(rootDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);}
}

2、读取内容

2.1、使用java8按行读取

package read;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;public class Java8Read {public static void main(String[] args) {// 文件String file = "锦瑟.poetry";try {Stream<String> lines = Files.lines(Paths.get(file));// 显示每一行数据lines.forEach(line -> System.out.println(line));} catch (IOException e) {e.printStackTrace();}}
}

2.2、使用Commons IO一次性读取

package read;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;public class CommonIORead {public static void main(String[] args) {String file = "天净沙-秋思.poetry";try {String content = FileUtils.readFileToString(new File(file), "UTF-8");System.out.println(content);} catch (IOException e) {e.printStackTrace();}}
}

2.3、使用Apache Tika提取PDF文本

导入依赖

<dependency><groupId>org.apache.tika</groupId><artifactId>tika-parsers</artifactId><version>1.20</version>
</dependency>
package read;import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;import java.io.FileInputStream;
import java.io.InputStream;public class TiKaRead {public static void main(String[] args) {String content = readPDF("他不懂.pdf");System.out.println(content);}public static String readPDF(String fileName){InputStream inputStream = null;String content = "";try {inputStream = new FileInputStream(fileName);// 创建一个自动解析器AutoDetectParser parser = new AutoDetectParser();// 使用-1表示不对文件内容的大小进行限制BodyContentHandler handler = new BodyContentHandler(-1);Metadata metaData = new Metadata();parser.parse(inputStream, handler, metaData, new ParseContext());System.out.println(metaData);// 调用Handler对象的toString获取正文内容content = handler.toString();} catch (Exception e) {e.printStackTrace();}finally {if(inputStream != null){try{inputStream.close();}catch (Exception e){System.out.println("Error Closing input stream.");}}}return content;}
}

3、清洗文件

3.1、使用正则表达式清洗ASCII文本

package filter;import com.sun.media.jfxmedia.track.Track;import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;public class FilterASCII {public static void main(String[] args) {try {System.out.println(cleanText("this s a 赵义    text."));} catch (Exception e) {e.printStackTrace();}}public static String cleanText(String text){// 1.去除所有非ASCII字符text = text.replaceAll("[^\\p{ASCII}]","");// 2.去除多余的空格text = text.replaceAll("\\s+"," ");// 3.清除ASCII控制字符text = text.replaceAll("[\\p{Cntrl}]","");// 4.清除非打印字符text = text.replaceAll("[^\\p{Print}]","");return text;}
}

4、解析文件

4.1、使用Univocity解析CSV文件

引入依赖

<dependency><groupId>com.univocity</groupId><artifactId>univocity-parsers</artifactId><version>2.8.1</version>
</dependency>

有很多采用Java编写的csv文件解析器。不过,Univocity是相对比较快的一种。

package parser;import com.univocity.parsers.common.processor.RowListProcessor;
import com.univocity.parsers.csv.CsvParser;
import com.univocity.parsers.csv.CsvParserSettings;import java.io.File;
import java.util.Arrays;
import java.util.List;public class UnivocityTest {public static void main(String[] args) throws Exception{String fileName = "模块表.csv";parseCSV(fileName);}public static void parseCSV(String fileName) throws Exception {// 创建一个配置对象,并配置CsvParserSettings csvParserSettings = new CsvParserSettings();// 自动检测输入中的分隔符序列csvParserSettings.setLineSeparatorDetectionEnabled(true);// 指定把每个解析的行存储在列表中,写入配置:使用rowListProcessor配置解析器,用来对每个解析行的值进行处理RowListProcessor processor = new RowListProcessor();csvParserSettings.setProcessor(processor);// 若CSV文件包含标题头,则可以把第一行看做文件中每个列的标题;否则无需设置。//csvParserSettings.setHeaderExtractionEnabled(true);// 使用给定的配置创建一个parser实例CsvParser csvParser = new CsvParser(csvParserSettings);csvParser.parse(new File(fileName));// 默认将第一行看做头String[] headers = processor.getHeaders();System.out.println(Arrays.asList(headers));List<String[]> rows = processor.getRows();for (String[] row : rows) {System.out.println(Arrays.asList(row));}}
}

4.2、使用Univocity解析TSV文件

TSV和CSV几乎是同一类文件,只不过是TAB分隔不同列。

package parser;import com.univocity.parsers.tsv.TsvParser;
import com.univocity.parsers.tsv.TsvParserSettings;import java.io.File;
import java.util.Arrays;
import java.util.List;public class UnivocityTest2 {public static void main(String[] args) {String fileName = "模块表.tsv";parseTSV(fileName);}public static void parseTSV(String fileName){// 创建一个配置对象,并配置TsvParserSettings settings = new TsvParserSettings();// 设置行分隔符settings.getFormat().setLineSeparator("\n");// 使用配置创建一个parserTsvParser parser = new TsvParser(settings);// 将文件内容一次性解析出来List<String[]> rows = parser.parseAll(new File(fileName));for (String[] row : rows) {System.out.println(Arrays.asList(row));}}
}

4.3、使用JDOM解析XML文件

导入依赖

<!-- https://mvnrepository.com/artifact/org.jdom/jdom2 -->
<dependency><groupId>org.jdom</groupId><artifactId>jdom2</artifactId><version>2.0.6</version>
</dependency>
package parser;import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;import java.io.File;
import java.io.IOException;
import java.util.List;public class JDomTester {public static void main(String[] args) {parserXML("类型.xml");}public static void parserXML(String fileName){File file = new File(fileName);SAXBuilder builder = new SAXBuilder();try {// 创建一个Document对象,代表访问的XML文件Document doc = builder.build(file);// 获取根元素Element rootEle = doc.getRootElement();// 获取根元素下的所有数据List<Element> records = rootEle.getChildren("RECORD");// 遍历节点for (Element record : records) {System.out.println("====== record ======");System.out.println("id:" + record.getChildText("type_id"));System.out.println("name:" + record.getChildText("type_name"));System.out.println("state:" + record.getChildText("state"));System.out.println("create time:" + record.getChildText("create_time"));}} catch (Exception e) {e.printStackTrace();}}
}

4.4、使用JSON.simple与JSON文件交互(写入和读取)

引入依赖

<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency><groupId>com.googlecode.json-simple</groupId><artifactId>json-simple</artifactId><version>1.1.1</version>
</dependency>
package parser;import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;import java.io.FileReader;
import java.io.FileWriter;public class JsonTester {public static void main(String[] args) throws Exception{String fileName = "书籍.json";writeJSONFile(fileName);readJSONFile(fileName);}public static void writeJSONFile(String fileName){// 创建JSON对象JSONObject obj = new JSONObject();obj.put("name","来自新世界");obj.put("author","贵志佑介");obj.put("introduce", "一部畅想未来的架空世界观的小说,不同于大多数科幻作品的风格,作者对未来展现的不是高科技时代,而是看起来甚至是比现在还要倒退一千年的时代...");// 添加3个书籍评论JSONArray comments = new JSONArray();comments.add("这是一本可以打满分的书。");comments.add("这是一本可以打90分的书。");comments.add("这是一本一般般的书。");obj.put("comments", comments);// 写入json文件FileWriter writer = null;try {writer = new FileWriter(fileName);System.out.println(obj.toJSONString());writer.write(obj.toJSONString());writer.flush();writer.close();} catch (Exception e) {e.printStackTrace();}}public static void readJSONFile(String fileName) throws Exception {// 创建一个JSON解析器JSONParser parser = new JSONParser();// 解析JSONObject object = (JSONObject)parser.parse(new FileReader(fileName));System.out.println("====== book info =======");System.out.println("name:" + object.get("name"));System.out.println("author:" + object.get("author"));System.out.println("introduce:" + object.get("introduce"));System.out.println("comments:" + object.get("comments"));}
}

还有一个工具包叫做fastjson,同样是google出品。

4.5、使用JSoup从一个URL中提取Web数据

jsoup是一个不错的解析工具,其解析速度非常之快。究其原因,主要是不需要对网页进行动态解析,也不支持对网页就行任何动态操作,而是直接解析第一次访问获得的内容。因此,在使用jsoup的时候如果有其他需求,例如想要调用按钮点击事件、触发远程调用等,应该考虑使用其他的工具,例如python一个很出名的爬虫框架selenium,该工具在java也有一个对应的工具包。

引入依赖

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.3</version>
</dependency>
package parser;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;public class JSoupTester {public static void main(String[] args) {extractDataByJSoup("https://www.baidu.com/");}public static void extractDataByJSoup(String url){try {Document doc = Jsoup.connect(url).timeout(10 * 1000).ignoreHttpErrors(true).get();if(doc == null){System.out.println("This url is null.");return;}// 提取网址标题System.out.println("====== The Web Info ======");System.out.println("title:" + doc.title());// 提取正文内容System.out.println("body content:" + doc.body().text());// 获取所有超链接:css选择器的写法System.out.println("all href:" + doc.select("a[href]"));} catch (Exception e) {e.printStackTrace();}}
}

4.6、使用Selenium WebDriver从网站中提取Web数据

使用这些工具的时候还需要在所在的服务器上安装对应的浏览器包,这里就不一一介绍了。

5、从MySQL数据库读取表格数据

读取mysql数据的方式相信只要是一个开发者,都掌握了各种五花八门的方式了,甚至编写了自己的访问框架。这里我们就学习一下比较原始的访问方式,不去深究一些主流框架的使用。

引入依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version>
</dependency>
package visit;import com.mysql.cj.jdbc.MysqlDataSource;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class MySQLTester {public static void main(String[] args) throws Exception {visitMysqlData();}public static void visitMysqlData() throws Exception {MysqlDataSource dataSource = new MysqlDataSource();dataSource.setUser("root");dataSource.setPassword("your_database_password");// 这里输入您的数据库地址,例如本机localhostdataSource.setServerName("10.21.1.242");// 建立连接Connection connection = dataSource.getConnection();Statement statement = connection.createStatement();// 获取查询数据:sunrun_sdfs是库名,sdfs_user是表明ResultSet resultSet = statement.executeQuery("select * from sunrun_sdfs.sdfs_user limit 5");while (resultSet.next()){System.out.println("====== user info ======");System.out.println("id: " + resultSet.getString("user_id"));System.out.println("name: " + resultSet.getString("user_name"));System.out.println("login name: " + resultSet.getString("login_name"));}resultSet.close();statement.close();connection.close();}
}

转载于:https://my.oschina.net/u/3091870/blog/3009243

【java数据科学】1.提取数据以及清洗数据相关推荐

  1. python数据科学实践 常象宇_python数据科学

    Python语言拥有大量可用于存储.操作和洞察数据的程序库,已然成为深受数据科学研究人员推崇的工具.本书以IPython.NumPy.Pandas.Matplotlib和Scikit-Learn这5个 ...

  2. python数据科学实践 常象宇_Python数据科学实践

    章基于Python的数据科学环境搭建 1.1Python是数据科学"大势所趋" 1.2Anaconda入门--工欲善其事,必先利其器 1.3JupyterNotebook入门 1. ...

  3. ROS:bag数据包内容提取——雷达点云数据和imu数据

    通常在利用ros采集传感器数据时,我们会得到一个包含多个传感器数据的bag数据包,下面将会介绍从bag数据包提取雷达点云数据和imu数据的方法. 系统版本:Ubuntu20.04 ROS版本:Noet ...

  4. python爬取所有数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...

    作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...

  5. 如何用python爬取数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...

    作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 总览 Web抓取是一种从网站提取数据的高效方法(取决于网站的规定) 了解如何使用流行的BeautifulSoup ...

  6. python数据科学手册_小白入门Python数据科学

    前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...

  7. 数据科学 IPython 笔记本 7.3 Pandas 数据操作

    7.3 Pandas 数据操作 原文:Data Manipulation with Pandas 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(P ...

  8. 免费idc公益接口_数据科学促进社会公益免费开放数据的最佳来源

    免费idc公益接口 内容(Contents) Introduction 介绍 What is Open Data? 什么是开放数据? Open vs. Free vs. Online Data 开放与 ...

  9. 数据科学导论python语言实现_数据科学导论:Python语言实现(原书第2版)

    数据科学导论:Python语言实现(原书第2版) 作者:(意)阿尔贝托·博斯凯蒂(Alberto Boschetti);(意)卢卡·马萨罗(Luca Massaron) 著 出版日期:2018年01月 ...

  10. python数据科学常国珍_《PYTHON数据科学:全栈技术详解》常国珍//赵仁乾//张秋剑著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 常国珍//赵仁乾//张秋剑著 出版社:机械工业出版社 出版时间:2018-07-01 00:00:00 版次:1 印次:1 印刷时间:2018-07-01 字数:250 页数:422 ...

最新文章

  1. mysql/mariadb:数据库变量(参数)管理
  2. python dataframe是什么_python – 逐个构建DataFrame的最快方法是什么?
  3. inception mysql 使用_mysql 审核引擎 goInception 的基本使用
  4. spring+hibernate--直接修改数据库,再通过hibernate查询数据不变
  5. windows10 显示实时网速
  6. 第一次在CSND做记录,关于linux修改文件的最后访问时间。
  7. ae导出html,AE导出json格式的Web动画工具 Bodymovin v5.6.1 + 使用教程
  8. 星星之火OIer:编程社四连测总结
  9. 基于SVG的绘制多边形jQuery插件
  10. PNG字幕文件自动生成工具
  11. 常见字读音(粤语)---(2)
  12. Dremel made simple with Parquet
  13. PPmoney基于Kubernetes的DevOps实践
  14. C# 合并、拆分PPT幻灯片
  15. Python遗传算法求一元函数最大值
  16. 【面试题】计算机网络常见面试题
  17. Unity3d实现双人网络坦克大战
  18. OSPF静默接口(Silent-Interface)有哪些特性?
  19. 增长黑客AB-Test系统(三)——AB-Test Hash分流
  20. 带信号灯的最短路dijkstra问题(阿里巴巴2018校园招聘算法题)

热门文章

  1. 计算机不识别u盘咋办,电脑不能识别U盘 U盘无法识别问题该怎么解决
  2. java就业班怎么改简历_Java面试,如何修改个人简历?一些过来人的经验!
  3. 为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片?
  4. 智能视频监控的应用方向
  5. 当VR遇上云计算,华为要让VR飞入寻常百姓家
  6. 香港云服务器CN2+BGP网络线路测试IP地址
  7. 盘点数据库2013之一:数据分析崛起
  8. 电商运营流程图模板分享,附赠绘制流程图方法
  9. springboot+vue驾校管理系统 idea科目一四预约考试,练车
  10. modbus/施耐德PLC协议网关