天猫移动推荐算法比赛记录(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);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值