⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decoder.java

📁 从Nokia的PCsuite套件的备份中读取出文本格式的通讯录。输出为以逗号分隔的contacts.csv文件。可以直接导入到outlook中。
💻 JAVA
字号:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

/**
 * @author Slice
 * licesh@gmail.com
 **/

public class Decoder
{
  public static class Contact
  {
    String Name;

    String CellPhone;

    String Work;

    public Contact(String N, String CP)
    {
      Name = N;
      CellPhone = CP;
    }

    public Contact(String N, String CP, String W)
    {
      Name = N;
      CellPhone = CP;
      Work = W;
    }
    
    public String getContact()
    {
      if(Work.equals(""))
        if(CellPhone.equals(""))
          return Name+",,"+"\r\n";
        else
          return Name+','+CellPhone+",\r\n";
      else
        return Name+','+CellPhone+','+Work+"\r\n";
    }
  }

  private ArrayList<Contact> contactsList;

  private String contacts;

  public Decoder()
  {
    decodeNokiaBak();
  }

  public void decodeNokiaBak()
  {
    try
    {
      contacts = readFile("2.txt");
      contactsList = new ArrayList<Contact>();
      int i = 0;
      while (true)
      {
        int si = contacts.indexOf("BEGIN:VCARD", i);
        if (si == -1) break;
        si += 11;
        i = si;
        int ei = contacts.indexOf("END:VCARD", i);
        i = ei + 9;
        readOneContact(si, ei - 1);
      }
      int j = 0;
      i++;
    } catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    Decoder de = new Decoder();
    de.writeFile("contacts.csv");
  }

  public void readOneContact(int startIndex, int endIndex)
  {
    String contact = contacts.substring(startIndex, endIndex+1);
    contact += '\0';
    char t;
    // read name
    int index = contact.indexOf("N:", 30);
    if (index == -1)
    {
      index = contact.indexOf("UTF-8");
      index += 6;
    }
    else index += 2;
    String ntemp = new String();
    for (int j = 0; contact.charAt(index) != ';'; j++, index++)
      ntemp += contact.charAt(index);
    String name = qpDecoding(ntemp);
    // read CELL
    String cell = new String();
    int cindex = contact.indexOf("CELL:", index);
    if (cindex != -1)
    {
      index = cindex;
      index += 5;
      t = contact.charAt(index);
      for (int j = 0; t == '+' || t == ' ' || t >= '0' && t <= '9'; j++)
      {
    	  cell += t;
    	  t = contact.charAt(++index);
      }
    }
    // read WORK
    String work = new String();
    int windex = contact.indexOf("WORK:", index);
    if (windex != -1)
    {
      index = windex;
      index += 5;
      t = contact.charAt(index);
      for (int j = 0; t == '+' || t == ' ' || t >= '0' && t <= '9'; j++)
      {
    	  work += t;
    	  t = contact.charAt(++index);
      }
    }
    //
    contactsList.add(new Contact(name, cell, work));
  }

  private String readFile(String fileName)
  {
    try
    {
      BufferedReader fr = new BufferedReader(new FileReader(fileName));
      StringBuffer out = new StringBuffer();
      String thisLine = new String();

      while (thisLine != null)
      {
        thisLine = fr.readLine();

        if (thisLine != null)
        {
          out.append(thisLine);
        }
      }
      fr.close();
      return out.toString();
    } catch(Exception e)
    {
      System.out.print(e.toString());
      return null;
    }
  }

  private void writeFile(String fileName)
  {
    try
    {
      BufferedWriter fw = new BufferedWriter(new FileWriter(fileName));
      fw.write("Name,Mobile Phone,Work\r\n");
      for(int i=0; i<contactsList.size(); i++)
      {
        fw.write(contactsList.get(i).getContact());
      }
      fw.close();
    } catch(Exception e)
    {
      e.printStackTrace();
    }

  }

  /**
   * quoted-printable编码
   */
  public static String qpEncodeing(String str)
  {
    char[] encode = str.toCharArray();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < encode.length; i++)
    {
      if ((encode[i] >= '!') && (encode[i] <= '~') && (encode[i] != '=')
          && (encode[i] != '\n'))
      {
        sb.append(encode[i]);
      }
      else if (encode[i] == '=')
      {
        sb.append("=3D");
      }
      else if (encode[i] == '\n')
      {
        sb.append("\n");
      }
      else
      {
        StringBuffer sbother = new StringBuffer();
        sbother.append(encode[i]);
        String ss = sbother.toString();
        byte[] buf = null;
        try
        {
          buf = ss.getBytes("utf-8");
        } catch(UnsupportedEncodingException e)
        {
          e.printStackTrace();
        }
        if (buf.length == 3)
        {
          for (int j = 0; j < 3; j++)
          {
            String s16 = String.valueOf(Integer.toHexString(buf[j]));
            // 抽取中文字符16进制字节的后两位,也就是=E8等号后面的两位,
            // 三个代表一个中文字符
            char c16_6;
            char c16_7;
            if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122)
            {
              c16_6 = (char)(s16.charAt(6) - 32);
            }
            else
            {
              c16_6 = s16.charAt(6);
            }
            if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122)
            {
              c16_7 = (char)(s16.charAt(7) - 32);
            }
            else
            {
              c16_7 = s16.charAt(7);
            }
            sb.append("=" + c16_6 + c16_7);
          }
        }
      }
    }
    return sb.toString();
  }

  /**
   * quoted-printable解码
   * 
   * @author issuesr
   * @param str
   * @return String
   * @date 2007-6-24
   */
  public final static String qpDecoding(String str)
  {
    if (str == null) { return ""; }
    try
    {
      StringBuffer sb = new StringBuffer(str);
      for (int i = 0; i < sb.length(); i++)
      {
        if (sb.charAt(i) == '\n' && sb.charAt(i - 1) == '=')
        {
          // 解码这个地方也要修改一下
          // sb.deleteCharAt(i);
          sb.deleteCharAt(i - 1);
        }
      }
      str = sb.toString();
      byte[] bytes = str.getBytes("US-ASCII");
      for (int i = 0; i < bytes.length; i++)
      {
        byte b = bytes[i];
        if (b != 95)
        {
          bytes[i] = b;
        }
        else
        {
          bytes[i] = 32;
        }
      }
      if (bytes == null) { return ""; }
      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
      for (int i = 0; i < bytes.length; i++)
      {
        int b = bytes[i];
        if (b == '=')
        {
          try
          {
            int u = Character.digit((char)bytes[++i], 16);
            int l = Character.digit((char)bytes[++i], 16);
            if (u == -1 || l == -1)
            {
              continue;
            }
            buffer.write((char)((u << 4) + l));
          } catch(ArrayIndexOutOfBoundsException e)
          {
            e.printStackTrace();
          }
        }
        else
        {
          buffer.write(b);
        }
      }
      return new String(buffer.toByteArray(), "UTF-8");
    } catch(Exception e)
    {
      e.printStackTrace();
      return "";
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -