1. 程式人生 > >大資料預處理,讀寫檔案為每一行資料增加一個標識ID(JAVA)

大資料預處理,讀寫檔案為每一行資料增加一個標識ID(JAVA)

對包含多行資料的資料集進行預處理,讀入文字檔案資料集,為每一條記錄增加一個唯一的ID,並儲存成一個新的文字檔案。

其中每行的ID生成規則為:每一條記錄對應生成0-33隨機數,每個數對應一個特定省份,最後原始記錄和新生成的省份標籤一起寫入新的文字檔案中。

Shell終端執行語句

#!/bin/bash
#下面設定輸入檔案,把使用者執行pre_deal.sh命令時提供的第一個引數作為輸入檔名稱
infile=$1
#下面設定輸出檔案,把使用者執行pre_deal.sh命令時提供的第二個引數作為輸出檔名稱
outfile=$2
#注意,最後的$infile> $outfile必須跟在}’這兩個字元的後面
awk -F "," 'BEGIN{
srand();
        id=0;
        Province[0]="山東";Province[1]="山西";Province[2]="河南";Province[3]="河北";Province[4]="陝西";Province[5]="內蒙古";Province[6]="上海市";
        Province[7]="北京市";Province[8]="重慶市";Province[9]="天津市";Province[10]="福建";Province[11]="廣東";Province[12]="廣西";Province[13]="雲南"; 
        Province[14]="浙江";Province[15]="貴州";Province[16]="新疆";Province[17]="西藏";Province[18]="江西";Province[19]="湖南";Province[20]="湖北";
        Province[21]="黑龍江";Province[22]="吉林";Province[23]="遼寧"; Province[24]="江蘇";Province[25]="甘肅";Province[26]="青海";Province[27]="四川";
        Province[28]="安徽"; Province[29]="寧夏";Province[30]="海南";Province[31]="香港";Province[32]="澳門";Province[33]="臺灣";
    }
    {
        id=id+1;
        value=int(rand()*34);       
        print id"\t"$1"\t"$2"\t"$3"\t"$5"\t"substr($6,1,10)"\t"Province[value]
    }' $infile> $outfile

Java語言:

import java.io.*;
import java.util.Random;

public class bigData {

    public static void main(String[] args) {
        FileInputStream fis = null;//檔案輸入流
        FileOutputStream fos = null;//檔案輸出流
        InputStreamReader isr = null;
        OutputStreamWriter osw = null;
        BufferedReader br = null;
        BufferedWriter bw =null;
        try {
            String str = "";
            String str1 = "";
            String str2 = "";
            int rand;
            fis = new FileInputStream("e:\\bigdatain.txt");// 讀入本地檔案
            fos = new FileOutputStream("e:\\bigdataout.txt");//寫入本地檔案

            isr = new InputStreamReader(fis);// InputStreamReader
            osw = new OutputStreamWriter(fos,"UTF-8");//寫入檔案編碼格式為UTF-8

            br = new BufferedReader(isr);// 從字元輸入流中讀取檔案中的內容
            bw = new BufferedWriter(osw);//將字元輸出流寫入到檔案中

            String a[] = {"山東","山西","河南","河北","陝西","內蒙古","上海市","北京市","重慶市","天津市","福建","廣東",
                          "廣西","雲南", "浙江","貴州","新疆","西藏","江西","湖南","湖北","黑龍江","吉林","遼寧","江蘇",
                          "甘肅", "青海","四川","安徽","寧夏","海南","香港","澳門","臺灣"};
            StringBuffer strb= new StringBuffer();//定義一個可變型別的String

            while ((str = br.readLine()) != null) {
                rand=new Random().nextInt(35);//生成0-34隨機數
                str1 = "\t"+a[rand] + "\n";//讀出對應標識ID
                str2=strb.append(str).append(str1).toString();//當讀取的一行不為空時,把讀到的str和str1進行連線並把值賦給str2
            }
            System.out.println(str2);// 打印出str2
            bw.write(str2+"\n");//寫入檔案

        } catch (FileNotFoundException e) {
            System.out.println("找不到指定檔案");
        } catch (IOException e) {
            System.out.println("讀取/寫入檔案失敗");
        } finally {
            try {
                br.close();
                isr.close();
                fis.close();
                bw.close();
                osw.close();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

因為資料太多太大,花費時間比較多,所以選擇簡單地建立一個檔案來進行演示,結果顯示如下:(左:讀入檔案;右:寫入檔案)

有什麼問題歡迎大家留言多多指教。