首页 > 代码库 > lyngsat网站卫星数据解析

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());
  }
 }
}

lyngsat网站卫星数据解析