我是靠谱客的博主 落后糖豆,最近开发中收集的这篇文章主要介绍天猫移动推荐算法比赛记录(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部