• 数据格式
  • 目标数据格式
  • 程序
  • 局限性

本文为原创博客,仅供技术学习使用。未经允许,禁止将其复制下来上传到百度文库等平台。如有转载请注明本文博客的地址(链接)

数据格式

首先,我来介绍一下数据格式。存在多个文本,每个文本,里面包含电影的id,用户的id及用户对电影的评分,及评分时间。如下面两个表:

这张图为目录下的文本。一个文本表示,一部电影所有用户的评分及评分时间。

目标数据格式

如下图所示,为所需要转化成的目标数据格式。其中,一行表示:一个用户对所有电影的评分(矩阵),没有打分的电影为null值,即转化成了评分矩阵。

程序

这里主要包含两个类,分别是:
FileGetData类主要是用来文件的读写。
Test是main方法,进行数据的实际操作。

package main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**文件操作类* @author 合肥工业大学管理学院  钱洋* @blog http://blog.csdn.net/qy20115549/* @mail 1563178220@qq.com*/
public class FileGetData {//将一个文本中数据的每一行存入list中public List<String> getData (String fileName) throws IOException {//读入的数据存入list<>中List<String> Data=new ArrayList<String>();File file = new File(fileName);//FileReader顺序读取文件FileReader fileReader = new FileReader(file);//根据FileReader创建的实例BufferedReader bufferedReader =new BufferedReader(fileReader);String s=null;while ((s=bufferedReader.readLine())!=null) {Data.add(s);}bufferedReader.close();fileReader.close();return Data;}//获取目录下的文本目录public List<String> getFiles( String filePath ){List<String> filelist = new ArrayList<String>();File root = new File( filePath );File[] files = root.listFiles();for ( File file : files ){if ( file.isDirectory() ){getFiles( file.getAbsolutePath() );filelist.add( file.getAbsolutePath() );}else{filelist.add( file.getAbsolutePath() );}}return filelist;}
}
package main;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;/**文件操作类* @author 合肥工业大学管理学院  钱洋* @blog http://blog.csdn.net/qy20115549/* @mail 1563178220@qq.com*/
public class Test {public static void main(String[] args) throws IOException {FileGetData fileGetData=new FileGetData();//获取目录下所有文件List<String> fileList=fileGetData.getFiles("E:\\熊强师兄数据处理\\sample\\");System.out.println(fileList.get(1));Map<String, String> useridandmovieid=new HashMap<String, String>();//获取所有用户idTreeSet<Integer> uniqueuser_id = new TreeSet<Integer>();//获取所用movieidTreeSet<Integer> uniquemovie_id = new TreeSet<Integer>();//循环每个目录下面的文件for (int i = 0; i < fileList.size(); i++) {List<String> data=fileGetData.getData(fileList.get(i));for (int j = 1; j< data.size(); j++) {//获取用户idString userid=data.get(j).split(",")[0];//获取电影idString movieid=data.get(0).replaceAll(":", "");String key=userid+":"+movieid;//表示电影评分String value=data.get(j).split(",")[1];//useridandmovieid数据格式:用户id:电影iduseridandmovieid.put(key,value);uniqueuser_id.add(Integer.parseInt(userid));uniquemovie_id.add(Integer.parseInt(movieid));}}//目标数据写入文本BufferedWriter output = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( new File("E:\\熊强师兄数据处理\\combineAlluser.txt")),"utf-8"));System.out.println(useridandmovieid.size());//将同一个用户对所有电影的评分抽取出来,排成一行,并写入文本Iterator<Integer> setIt = uniqueuser_id.iterator();while ( setIt.hasNext() ){int uniqueuser=setIt.next();Iterator<Integer> setIt1 = uniquemovie_id.iterator();//排成一行数据String userrowscore=uniqueuser+"\t";while ( setIt1.hasNext() ){int uniquemovie=setIt1.next();String uniqueuserkey=uniqueuser+":"+uniquemovie;String score=useridandmovieid.get(uniqueuserkey);userrowscore+=score+"\t";}output.append(userrowscore+"\n");}output.close();}}

局限性

从上面的Test程序中可以看出,这里使用的map作为数据中转站。这里就有一个问题,就是大数据怎么办?
针对数据量不是很大的情况,完全没问题。针对大一点的数据集,就会出现:Java heap space
针对这个问题的解决,我再写一篇博客,介绍怎么解决。

如何将多个文本数据转化为指定数据格式[以电影数据为例](数据预处理)相关推荐

  1. pb 修改数据窗口种指定字段位置_在PB中控制 数据窗口 列修改属性.doc

    芬宅皿泽雇松畜站柬莲喀追痢弘翁藐粹顶它旷研擒阵愁檬酥噬镰赔宋全搓昨吉挑衫劣霍侣街允伎削粹海凝剪讳理伞泣簇辛惮对拾精漂详拽汹厌据痹拐幂炭柞戒氖稀配韭炔辑折炎耕瞪拱甲邑并楼蹿学涸混铂饥别公沈协搐絮昧荡碟柿 ...

  2. oracle 中将number类型的数据转化成指定格式的小数

    select to_char(0.1,'0.09') nums from dual;

  3. Excel完成将多行多列数据转化为一列

    想要把Excel的数据用Word转成一行.那么第一步当然是将excel中的数据先复制下啦,复制好了之后打开word,然后进行粘贴,注意这里要选择"只保留文本"哦. 接下来我们要用鼠 ...

  4. 生态统计学里的数据转化与标准化

    写在前面: 我们组去年发表的一篇文章,很幸运的得到了国内同行的"指点" .仔细阅读檄文以后,深感统计学的思维和理念在生态学里的重要性,而写文章的同行跟我们的理解可能存在出入.认真回 ...

  5. R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表、对转化为长表的数值数据列进行离散化、pivot_wider将数据转化为宽表

    R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表.对转化为长表的数值数据列进行离散化.pivot_wider将数据转化为宽表 ...

  6. R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集

    R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series).使用window函数从时间序列对象中提取数据子集 目录

  7. 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 逐行遍历文件文本数据 | 获取文件中的文本行 | 查询文本行数据 | 追加文件数据 | 使用占位符方式拼接字符串 )

    文章目录 一.逐行遍历文件文本数据 1.获取文件中的文本行 2.查询文本行数据 3.追加文件数据 4.使用占位符方式拼接字符串 二.完整代码示例 一.逐行遍历文件文本数据 1.获取文件中的文本行 调用 ...

  8. dbeaver 数据转化 mapping_Python机器学习实例:数据竞赛-足球运动员身价估计

    前言 1,背景介绍 每个足球运动员在转会市场都有各自的价码.本次数据练习的目的是根据球员的各项信息和能力来预测该球员的市场价值. 2,数据来源 FIFA2018 3,数据文件说明 数据文件分为三个: ...

  9. 将数据转化成字符串时:用字符串的链接 还是 StringBuilder

    /*目的:将数据转化成字符串时:用字符串的链接 还是 StringBuilder呢? */ public class Test{public static void main(String[] arg ...

最新文章

  1. Android即时通讯与IOS端发送语音的问题。
  2. linux crontab环境变量,Linux下crontab内环境变量与Shell环境变量的关系【转】
  3. vba读取csv文件到excel_利用VBA打开顺序文件,并读取
  4. VMware下主机与虚拟机通信问题
  5. 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机
  6. Java垃圾回收日志解析
  7. 标准输入输出(C++)
  8. 1114D . Flood Fill
  9. linux iptables找不到,centos /etc/sysconfig/下找不到iptables文件解决方法
  10. ad导出元件清单_【原创分享】 Altium Designer 一键导出坐标和BOM脚本,V0.6
  11. 【算法】剑指 Offer 03. 数组中重复的数字
  12. android编程设备信息,Android获取当前手机设备信息工具类详解
  13. hl usb-rs232驱动
  14. vue中使用阿里巴巴矢量图标库的图标
  15. LaTex在线编辑工具overleaf在英文模板中输入中文
  16. 项目管理体制改革的经验和成效(转)
  17. 工作能力强的人,都有哪些特点?
  18. PiaPik网盘 2023.2
  19. 洛伦兹力的matlab求解,问:由安培力推导洛伦兹力的过程?
  20. QT qrand()随机函数

热门文章

  1. Git的基本概念/常用命令及实例
  2. ORACLE 如何产生一个随机数
  3. 容器编排技术 -- Kubernetes kubectl create 命令详解
  4. Redis面试 - redis 的并发竞争问题是什么?
  5. linux服务器开放防火墙和端口,以及查询状态
  6. “The server requested authentication method unknown to the client.”的解决方案
  7. C#LeetCode刷题之#589-N叉树的前序遍历(N-ary Tree Preorder Traversal)
  8. C#LeetCode刷题之#551-学生出勤纪录 I​​​​​​​(Student Attendance Record I)
  9. 从安装到部署的Cordova iOS应用开发说明
  10. amazon 使用密码登录_我们通过使用Amazon SageMaker大规模提供机器学习模型学到了什么...