lyngsat网站卫星数据解析
package com.wh.sattp; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.OutputStreamWriter; public class Dealhtml { private static String filepath=""; private static String filepath_common=""; private static String filepath_android=""; /*处理的文件夹。在D:/satdeal/下根据地区创建文件夹,每个文件夹 下面 分为 txt common android 三个子文件夹 txt中的数据为网站的源代码保存的txt文本数据。common为解析出的通用数据*/ //private static String FilePath="D:/satdeal/atlantic/"; //private static String FilePath="D:/satdeal/europe/"; //private static String FilePath="D:/satdeal/asia/"; private static String FilePath="D:/satdeal/test/"; public static void main(String[] args) { //列出当前文件夹里面的内容,删除掉common和android里面的文件 File file=new File(FilePath+"txt"); File files[]=file.listFiles(); int size=files.length; filepath_common=FilePath+"/common/"; filepath_android=FilePath+"/android/"; System.out.println(System.currentTimeMillis()); fileinit(); for(int i=0;i<size;i++) { filepath=files[i].getAbsolutePath(); filepath_common=FilePath+"/common/"; filepath_android=FilePath+"/android/"; //System.out.println("str==" + filepath); dealfile(filepath); } System.out.println(System.currentTimeMillis()); } /* * 删除掉文件夹中原有的文件 * */ private static void fileinit() { File file=new File(filepath_common); File files[]=file.listFiles(); int csize=files.length; for(int i=0;i<csize;i++) { files[i].delete(); } file=new File(filepath_android); files=file.listFiles(); csize=files.length; for(int i=0;i<csize;i++) { files[i].delete(); } } /* * 拿到指定的txt文本 开始解析数据 * 1.解析<title> 里面包含卫星名及经度, * 2.确定common 和android下面的文件名 * */ private static void dealfile(String path) { File file = new File(path); FileInputStream ins; try { ins = new FileInputStream(file); int readsize; byte b[] = new byte[1024000]; String str=null; while ((readsize = ins.read(b)) >= 0) { System.out.println("readsize=====" + readsize); byte first[]=new byte[100]; for(int g=0;g<100;g++) { first[g]=b[g]; } String fis=new String(first); int index1=fis.indexOf("<title>"); int index2=fis.indexOf("</title>"); String filename=fis.substring(index1+7, index2).replace(‘\\‘,‘ ‘); filename=filename.replace(‘/‘, ‘ ‘); filepath_common+=filename+".txt"; filepath_android+=filename+".xml"; System.out.println("filename=====" + filename); //<title>Thor 5 at 0.8°W - LyngSat</title> str += new String(Byte_dealto_String(b,readsize)); //System.out.println("str=====" + str); } dealstr(str); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 处理传入的byte数组 * 规则:1.先取出所有的 HVRL字符; * 2.原样过滤掉前五个和最后五个数据 实际传入的数据是要<1024000的 * 3.判断连续的四个数字或者五个数字(频率和符号率都是4位或者5位的) * freq的两种格式: >123456& 和> 1234& * symb的两种格式: >12345- 和>1234- * 取出用count标示: * 小于4时跳过相同个数 * count==10 4位freq * count==11 4位symb * count==20 5位freq * count==21 5位symb * 4.freq 用<>包裹起来 symb 用* #并转行包裹 返回有效byte数组 * * */ private static byte[] Byte_dealto_String(byte[] b,int size) { byte c[] = new byte[10240]; int j = 0; //int size = b.length; //System.out.println("size===="+size); for (int i = 0; i < size; i++) { int count=1; if((b[i]==‘H‘||b[i]==‘V‘)||(b[i]==‘R‘||b[i]==‘L‘)) { if(i-2>=0&&b[i-1]==‘;‘&&b[i-2]==‘p‘&&b[i+1]==‘<‘) { c[j] = b[i]; j++; } } if (i < 5 || i > size-5) { if (b[i] >= ‘0‘ && b[i] <= ‘9‘) { c[j] = b[i]; j++; } } else { if (b[i] >= ‘0‘ && b[i] <= ‘9‘) { count=1; if (b[i + 1] >= ‘0‘ && b[i + 1] <= ‘9‘) { count=2; if (b[i + 2] >= ‘0‘ && b[i + 2] <= ‘9‘) { count=3; if (b[i + 3] >= ‘0‘ && b[i + 3] <= ‘9‘) { count=4; if(b[i-1]==‘>‘||(b[i-2]==‘>‘&&b[i-1]==‘ ‘)) { if(b[i + 4] >= ‘0‘ && b[i + 4] <= ‘9‘) { count=5; if(b[i + 5] == ‘&‘) { count=20; }else if(b[i + 5] == ‘-‘) { count=21; } }else if(b[i + 4] == ‘&‘) { count=10; }else if(b[i + 4]==‘-‘) { count=11; } } } } } } } if(count<4) { i+=count-1; }else { if(count>5&&count<20) { //freq if(count==10) { c[j]=‘<‘; j++; }else if(count==11) { c[j]=‘*‘; j++; } c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; if(count==10) { c[j]=‘>‘; j++; }else if(count==11) { c[j]=‘#‘; j++; c[j]=‘\n‘; j++; } } if(count>12) { //freq if(count==20) { c[j]=‘<‘; j++; }else if(count==21) { c[j]=‘*‘; j++; } c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; c[j]=b[i]; j++; i++; if(count==20) { c[j]=‘>‘; j++; }else if(count==21) { c[j]=‘#‘; j++; c[j]=‘\n‘; j++; } } } } c[j]=‘ ‘; j++; c[j]=‘ ‘; byte d[] = new byte[j]; int dsize=d.length; for(int k=0;k<j;k++) { d[k]=c[k]; } return d; } /* * 处理得到的数据。 * 根据 \n来切出字符串数组 此时有效数据为<12345>V*67890# * 解析数组 先找到 VHRL*的组合定位 < #的位置 * 规则 : 1.已VHRL为起始 前6和前7 定位< 后6后7定位# * 2.按照定位切割有用数据 保存为 <12345>V*67890 * 判断检测切割的数据 * 1.检测 > 位置应该大于等于5且小于等于6 * 2.判断<>中的数字 应该在3000-13000之间 * * * 解析完毕 开始存储数据到指定文件夹 * */ private static void dealstr(String str) { String all[]=str.split("\n"); //System.out.println("str===" + all.length); int size=all.length; int count=0; String strnew[]=new String[200]; for(int i=0;i<size;i++) { byte bstr[]=all[i].getBytes(); int len= bstr.length; for(int j=0;j<len;j++) { if((bstr[j]==‘R‘||bstr[j]==‘L‘||bstr[j]==‘H‘||bstr[j]==‘V‘)&&bstr[j+1]==‘*‘) { int first=0; int end=0; if(j-7>=0&&bstr[j-7]==‘<‘) { first=j-7; } if(j-6>=0&&bstr[j-6]==‘<‘) { first=j-6; } if(j+7<len&&bstr[j+7]==‘#‘) { end=j+7; } if(j+6<len&&bstr[j+6]==‘#‘) { end=j+6; } String str_us=all[i].substring(first, end); //System.out.println("str_us==" + str_us); int freqindex=str_us.indexOf(‘>‘); if(freqindex<=4) { System.out.println(" Error**** freqindex=" + freqindex+" str_us="+str_us); continue; } String strfreq=str_us.substring(1, freqindex); int freq=Integer.valueOf(strfreq); if(freq>13000||freq<3000) { System.out.println("Error**** freq==" + strfreq); //continue; }else{ strnew[count]=all[i].substring(first, end); count++; } break; } } } try { FileWriter fw = new FileWriter(filepath_common,true); String allstr=""; for(int i=0;i<count;i++) { int lens=strnew[i].length(); if(lens<11||lens>15) { System.out.println("Error:****"+filepath_common+"****"+strnew[i]); }else{ fw.write(strnew[i]+"\n",0,lens+1); } } fw.flush(); }catch(Exception e) { System.out.println(e.toString()); } String_toandroid_file(strnew,count); } /* * 将数据保存为需要的android xml数据 * 数据原样为<12345>V*67890 * 1.先替换<> 数据变为 <transponder frequency="12345000" symbol_rate="V*67890 * 2.在将字串切为 <transponder frequency="12345000" symbol_rate="V 67890 * 3.在切为 <transponder frequency="12345000" symbol_rate=" V * 4.拼凑 <transponder frequency="12345000" symbol_rate="67890000" * 5.最后<transponder frequency="12345000" symbol_rate="67890000" polarisation="V"/> * * */ private static void String_toandroid_file(String allstr[],int count) { int size=allstr.length; for(int i=0;i<count;i++) { //<10962>H*1550 String str=allstr[i]; str=str.replaceAll( "<","<transponder frequency=\""); str=str.replaceAll( ">","000\" symbol_rate=\""); String strw[]=new String[2]; int index=str.indexOf(‘*‘); strw[0]=str.substring(0, index); strw[1]=str.substring(index+1, str.length()); int length=strw[0].length(); String strq=strw[0].substring(length-1, length); String stra=strw[0].substring(0,length-1); stra+=""+strw[1]+"000\""; if(strq.equals("H")||strq.equals("L")) { stra+= " polarisation=\"H\"/>"; }else { stra+= " polarisation=\"V\"/>"; } stra+="\n"; allstr[i]=stra; } try { FileWriter fw = new FileWriter(filepath_android,true); //String allstr=""; for(int i=0;i<count;i++) { fw.write(allstr[i],0,allstr[i].length()); } fw.flush(); }catch(Exception e) { System.out.println(e.toString()); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。