概述
1、将500M1200万条的数据分割
import java.io.*;
public class textInput {
public static void readTxtFile(String filePath){
try{
File file = new File(filePath);
if(file.isFile()&&file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt= null;
int j=1;
for(int i=1;i<14;i++){
//把文件分成13份,差不多每份100万条记录
FileWriter writer;
writer = new FileWriter("D://1-"+i+".txt");
int k=i*1000000;
while(j<k&&(lineTxt=bufferedReader.readLine())!=null){
//这里if(i%2)是在换行为cr+lf(/r/n)
//时,读两次才能 读出一行内容,而且第二次
//读的为空,所以除以二不要第二次读的内容。
//如果文本换行为lf则不考虑。
//if((i%2)!=0){
//System.out.print(i+lineTxt+"n");
//加/r/n才能换行输出,是windows平台下规定,换成line.separator就不用考虑那么多了
writer.write(lineTxt+System.getProperty("line.separator"));
j++; }
writer.flush();
writer.close();
}//for
}
else
{
System.out.println("找不到指定文件!");
}
}catch(Exception e){
System.out.println("读取文件内容出错");
}
}
public static void main(String args[]){
String filePath= "D:\1.txt";
readTxtFile(filePath);
}
}
这里如果用git bash 的split命令一行就可以解决问题:
split –1000000 test1.txt 1
//意思是输入文件时test1.txt,每个输出文件有1000000行内容,输出文件是以1开头的后面自己补abcd的文件
2、提取18号的数据作为测试集
import java.io.*;
import java.util.regex.*;
public class textInput {
public static void readTxtFile(String filePath){
try{
File file = new File(filePath);
if(file.isFile()&&file.exists()){
InputStreamReader read = new InputStreamReader(new FileInputStream(file));
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt= null;
int j=1;
String date;
String[] content = new String[6];
//这里用正则表达式来选择要提取的内容
//正则表达式先设置pattern,然后看pattern
//的match对象与目标是否匹配
Pattern pattern = Pattern.compile("2014-12-18.+");
for(int i=1;i<2;i++){
FileWriter writer;
writer = new FileWriter("D://test-"+i+".txt");
int k=i*13000000;
while(j<k&&(lineTxt=bufferedReader.readLine())!=null){
content = lineTxt.split(",");
Matcher matcher = pattern.matcher(content[5]);
if(matcher.matches())
writer.write(lineTxt+System.getProperty("line.separator"));
j++; }
writer.flush();
writer.close();
}//for
}
else
{
System.out.println("找不到指定文件!");
}
}catch(Exception e){
System.out.println("读取文件内容出错");
}
}
public static void main(String args[]){
String filePath= "D:\1.txt";
readTxtFile(filePath);
}
}
其实就是在分割文件的基础上改成用正则表达式选择行而已。而且同样大神一条代码就解决了。。。。。。
grep ‘<man>' input1.txt output1.txt
意思是在input1.txt中选择有man字符串的行,输出到output1.txt,还有awk,sed命令有类似效果。
3、将数据分成一天一个集合
import java.io.*;
import java.util.regex.*;
public class textInput {
public static void readTxtFile(String filePath){
try{
File file = new File(filePath);
if(file.isFile()&&file.exists()){
//InputStreamReader read = new InputStreamReader(new FileInputStream(file));
//BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt= null;
String date;
String[] content = new String[6];
for(int i=1;i<32;i++)
{
InputStreamReader read = new InputStreamReader(new FileInputStream(file)); //必须每次重新输入,才能使指针在开头
BufferedReader bufferedReader = new BufferedReader(read); //使用mark reset 本来可以,但是在这里会报内存不够错误
int month=(i>13)?12:11;
int day=(17+i)==30?30:(17+i)%30;
if(day<10)
date = "2014-"+month+"-0"+day;
else
date = "2014-"+month+"-"+day;
Pattern pattern = Pattern.compile(date+".+");
FileWriter writer;
writer = new FileWriter("D://"+date+".csv");
writer.write("user_id,item_id,behavior_type,user_geohash,item_category,time"+System.getProperty("line.separator"));
int k=13000000;
int j=1;
while(j<k&&(lineTxt=bufferedReader.readLine())!=null){
content = lineTxt.split(",");
Matcher matcher = pattern.matcher(content[5]);
if(matcher.matches())
writer.write(lineTxt+System.getProperty("line.separator"));
j++; }
writer.flush();
writer.close();
}//for
}
else
{
System.out.println("找不到指定文件!");
}
}catch(Exception e){
System.out.println("读取文件内容出错");
}
}
public static void main(String args[]){
String filePath= "D:\1.txt";
readTxtFile(filePath);
}
}
最后
以上就是落后糖豆为你收集整理的天猫移动推荐算法比赛记录(1)的全部内容,希望文章能够帮你解决天猫移动推荐算法比赛记录(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复