1. 程式人生 > >Java基礎-----從Excel中獲取資料生成shell指令碼

Java基礎-----從Excel中獲取資料生成shell指令碼

前言

java讀取Excel的驅動包:
連結:https://pan.baidu.com/s/1ejCR9sS2OUmttFYpQnJkKQ
提取碼:58rm

實現1:

從Excel中讀取表名,由於每個欄位會對應一個表名,故讀取的某列會有若干個連續的表名出現,所以用set集合來儲存表名避免重複。

package com.my.cn;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedHashSet;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class ShellScript {
	public static void main(String[] args) throws IOException, BiffException {
		int sheetnum = 10;
		int columns = 8;
		String name = "YZ";
		String outPath = "C://Users/Administrator/Desktop/shell/" + name + "/";
		ShellScript sspt = new ShellScript();
		LinkedHashSet<String> set = new LinkedHashSet<>();
		//儲存在Excel中讀取到的某列資料,由於獲取的資料要互補相同因此使用set集合來儲存
		sspt.wListName(set,sheetnum,columns);
		//生成shell指令碼
		sspt.getShellScript(set,outPath,name);
	}

	public  void getShellScript(LinkedHashSet<String> set, String outPath,String name) throws IOException {
		int line = 1;
		for (String s : set) {
			BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outPath + name + "_" + line + "_" + s + "_BF.sh")));
			String nameOne = "hadoop fs -test -e hdfs://hdpdw01:8020/user/hadoop/hzswdw/Historical_filing_area/"
					+ name + "_L/" + "L_" + name + "_" + s + "_L_$time";
			String nameTwo = "hadoop distcp -m 5 hdfs://hdpdw01:8020/user/hadoop/sqoop/"
					+ name + "_Q/" + "S_" + name + "_" + s + "_Q";
			String nameThree = "hdfs://hdpdw01:8020/user/hadoop/hzswdw/Historical_filing_area/"
					+ name + "_L/" + "L_" + name + "_" + s + "_L_$time";
			
			writer.write("#!bin/bash\n");
			writer.write("time=$(date " + "+%y-%m-%d" + ")\n");
			writer.write("######################################################\n");
			writer.write("#用途:用於原始資料的歷史歸檔\n");
			writer.write("#建立人:\n");
			writer.write("#建立時間:\n");
			writer.write("#修改人:\n");
			writer.write("#修改時間:\n");
			writer.write("#修改內容:\n");
			writer.write("#######################################################\n");
			writer.write(nameOne + "\n");
			writer.write("if [ $? -eq 0 ]; then\n");
			writer.write("exit\n");
			writer.write("else\n");
			writer.write(nameTwo + "   " + nameThree + "\n");
			writer.write("fi");
			line ++;
			writer.close();
		}
		
	}

	public void wListName(HashSet<String> set,int sheetnum,int columns) throws BiffException, IOException {
		Workbook workbook=Workbook.getWorkbook(new File("E:\\專案\\我的任務\\資料\\資料.xls")); 
        //2:獲取第一個工作表sheet
        Sheet sheet=workbook.getSheet(sheetnum);
        
        for(int i=1;i<sheet.getRows();i++){
        	Cell cell=sheet.getCell(columns,i);
	        String s = cell.getContents();
	        
	        //去除字串中的換行符
	        s = s.replace("\n", "");
	        if (!s.equals("")) {
	        	set.add(s);
	        }
        }
        System.out.println(set);
        System.out.println(set.size());

        workbook.close();
	}

}
實現2:

實現2與實現1的不同之處在於,實現2使用Reader類的readLine()方法來讀取txt檔案的一行資料。

package com.my.cn;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedHashSet;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class SQLLoad {
	public static void main(String[] args) throws IOException, BiffException {
		int sheetnum = 4;
		int columns = 11;
		String name = "gis";
		String sqlname = null;
		String outPath = "C://Users/Administrator/Desktop/loadsql/" + name + "/";
		
		//2:獲取第一個工作表sheet
		BufferedReader reader = new BufferedReader(new FileReader(new File("C:\\Users\\Administrator\\Desktop\\2.txt")));
		
		while ((sqlname = reader.readLine()) != null) {
			BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outPath + sqlname)));
			writer.write("#!bin\bash\n");
			writer.write("hive -f " + sqlname);
			writer.close();
		}
	}

}