Java基礎-----從Excel中獲取資料生成shell指令碼
阿新 • • 發佈:2018-11-19
前言
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(); } } }