package cai.fu.com;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.SystemUtils;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFReader;
import com.linuxense.javadbf.DBFWriter;
import net.sf.json.JSONObject;
import redis.clients.jedis.Jedis;
public class Rwdbf {
private static Jedis jedis;
public static void setup() {
// 连接redis服务器,192.168.0.188:6379
jedis = new Jedis("192.168.0.188", 6379);
// 权限认证
// jedis.auth("sa123456");
}
public static void readDBF(String path)
{
InputStream fis = null;
Map map = new HashMap();
Map maptop = new HashMap();
try {
// 读取文件的输入流
fis = new FileInputStream(path);
// 根据输入流初始化一个DBFReader实例,用来读取DBF文件信息
DBFReader reader = new DBFReader(fis);
// 调用DBFReader对实例方法得到path文件中字段的个数
int fieldsCount = reader.getFieldCount();
Object[] rowValues;
List<String> keyLs = new ArrayList<String>();
Map<String, JSONObject> allMap = new HashMap<String, JSONObject>();
Map<String, JSONObject> top30Map = new HashMap<String, JSONObject>();
Map<String, JSONObject> last30Map = new HashMap<String, JSONObject>();
long begin = System.currentTimeMillis();
long end = System.currentTimeMillis();
// 一条条取出path文件中记录
while ((rowValues = reader.nextRecord()) != null) {
String symbol = rowValues[0].toString();
for (int i = 0; i < rowValues.length; i++) {
if (i == 0) {
// 0.股票代码
map.put("symbol", symbol);
} else if (i == 1) {
// 股票名称
map.put("securiName", rowValues[i].toString());
} else if (i == 2) {
String cloPrices = rowValues[i].toString();
double topPrices = Double.parseDouble(cloPrices) * 1.1;
double fallPrices = Double.parseDouble(cloPrices) * 0.90;
double pricetop = topPrices - 9;
double pricefall = fallPrices - 9;
BigDecimal bfall = new BigDecimal(pricefall);
double pricefa = bfall.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
BigDecimal btop = new BigDecimal(pricetop);
double priceto = btop.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 7.跌停价
map.put("pricefall", pricefa);
// 6.涨停价
map.put("pricetop", pricetop);
BigDecimal bdto = new BigDecimal(Double.parseDouble(rowValues[i].toString()));
double pricebdto = bdto.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 3.收盘价
map.put("close", pricebdto);
} else if (i == 3) {
// 2.今开
map.put("open", rowValues[i].toString());
} else if (i == 4) {
// 1.现价
map.put("currentPrice", rowValues[i].toString());
} else if (i == 5) {
// 9.成交数量
map.put("amount", new BigDecimal(rowValues[i].toString()).toPlainString());
} else if (i == 6) {
// 成交金额
map.put("dealAmount", rowValues[i].toString());
} else if (i == 7) {
map.put("HQCJBS", rowValues[i].toString());
} else if (i == 8) {
BigDecimal hqzgcj = new BigDecimal(rowValues[i].toString());
double pricehqzgcj = hqzgcj.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 4.最高价
map.put("high", pricehqzgcj);
} else if (i == 9) {
BigDecimal hazdcj = new BigDecimal(rowValues[i].toString());
double priceHazdcj = hazdcj.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// 5.最低价
map.put("low", priceHazdcj);
} else if (i == 10) {
map.put("HQSYL1", rowValues[i].toString());
} else if (i == 11) {
map.put("HQSYL2", rowValues[i].toString());
} else if (i == 12) {
map.put("HQJSD1", rowValues[i].toString());
} else if (i == 13) {
map.put("HQJSD2", rowValues[i].toString());
} else if (i == 14) {
map.put("HQHYCC", rowValues[i].toString());
} else if (i == 15) {
// HQSJW5:行情Sell价位5
// HQSSL5:行情Buy数量5
map.put("HQSJW5", rowValues[i].toString());
} else if (i == 16) {
map.put("HQSSL5", rowValues[i].toString());
} else if (i == 17) {
map.put("HQSJW4", rowValues[i].toString());
} else if (i == 18) {
map.put("HQSSL4", rowValues[i].toString());
} else if (i == 19) {
map.put("HQSJW3", rowValues[i].toString());
} else if (i == 20) {
map.put("HQSSL3", rowValues[i].toString());
} else if (i == 21) {
map.put("HQSJW2", rowValues[i].toString());
} else if (i == 22) {
map.put("HQSSL2", rowValues[i].toString());
} else if (i == 23) {
map.put("HQSJW1", rowValues[i].toString());
} else if (i == 24) {
map.put("HQSSL1", rowValues[i].toString());
} else if (i == 25) {
map.put("HQBJW1", rowValues[i].toString());
} else if (i == 26) {
map.put("HQBSL1", rowValues[i].toString());
} else if (i == 27) {
map.put("HQBJW2", rowValues[i].toString());
} else if (i == 28) {
map.put("HQBSL2", rowValues[i].toString());
} else if (i == 29) {
map.put("HQBJW3", rowValues[i].toString());
} else if (i == 30) {
map.put("HQBSL3", rowValues[i].toString());
} else if (i == 31) {
map.put("HQBJW4", rowValues[i].toString());
} else if (i == 32) {
map.put("HQBSL4", rowValues[i].toString());
} else if (i == 33) {
map.put("HQBJW5", rowValues[i].toString());
} else if (i == 34) {
map.put("HQBSL5", rowValues[i].toString());
}
// 8.换手率
map.put("change", "");
}
if ((symbol.startsWith("000") || symbol.startsWith("002") || symbol.startsWith("300"))) {
// System.out.print(map.get("symbol")+"\t");
// System.out.print(map.get("securiName")+"\t");
// System.out.print(map.get("currentPrice")+"\t");
// System.out.print(map.get("close")+"\t");
//System.out.println(map.get("dealAmount")+"\t");
//System.out.print(new BigDecimal(map.get("dealAmount").toString()).toPlainString()+"\t");
BigDecimal b = new BigDecimal(map.get("pricefall").toString());
double pricefall = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//System.out.print(pricefall+"\t");
BigDecimal bp = new BigDecimal(map.get("pricetop").toString());
double pricetop = bp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
//System.out.println(pricetop+"\t");
maptop.put("symbols",map.get("symbol"));
maptop.put("securiNames",map.get("securiName"));
maptop.put("currentPrices",map.get("currentPrice"));
maptop.put("closes",map.get("close"));
maptop.put("dealAmounts",new BigDecimal(map.get("dealAmount").toString()).toPlainString());
maptop.put("pricefalls",map.get("pricefall"));
maptop.put("pricetopss",map.get("pricetop"));
}
// if(map.get("symbol").equals("000")){
// BigDecimal b = new BigDecimal(map.get("pricefall").toString());
// double pricefall = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.print(pricefall+"\t");
// BigDecimal bp = new BigDecimal(map.get("pricetop").toString());
// double pricetop = bp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.println(pricetop+"\t");
//
// maptop.put("symbols",map.get("symbol"));
// maptop.put("securiNames",map.get("securiName"));
// maptop.put("currentPrices",map.get("currentPrice"));
// maptop.put("closes",map.get("close"));
// maptop.put("dealAmounts",new BigDecimal(map.get("dealAmount").toString()).toPlainString());
// maptop.put("pricefalls",map.get("pricefall"));
// maptop.put("pricetopss",map.get("pricetop"));
// }else if(map.get("symbol").equals("002")){
// BigDecimal b = new BigDecimal(map.get("pricefall").toString());
// double pricefall = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.print(pricefall+"\t");
// BigDecimal bp = new BigDecimal(map.get("pricetop").toString());
// double pricetop = bp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.println(pricetop+"\t");
//
// maptop.put("symbols",map.get("symbol"));
// maptop.put("securiNames",map.get("securiName"));
// maptop.put("currentPrices",map.get("currentPrice"));
// maptop.put("closes",map.get("close"));
// maptop.put("dealAmounts",new BigDecimal(map.get("dealAmount").toString()).toPlainString());
// maptop.put("pricefalls",map.get("pricefall"));
// maptop.put("pricetopss",map.get("pricetop"));
// }else if(map.get("symbol").equals("300")){
// BigDecimal b = new BigDecimal(map.get("pricefall").toString());
// double pricefall = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.print(pricefall+"\t");
// BigDecimal bp = new BigDecimal(map.get("pricetop").toString());
// double pricetop = bp.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
// //System.out.println(pricetop+"\t");
//
// maptop.put("symbols",map.get("symbol"));
// maptop.put("securiNames",map.get("securiName"));
// maptop.put("currentPrices",map.get("currentPrice"));
// maptop.put("closes",map.get("close"));
// maptop.put("dealAmounts",new BigDecimal(map.get("dealAmount").toString()).toPlainString());
// maptop.put("pricefalls",map.get("pricefall"));
// maptop.put("pricetopss",map.get("pricetop"));
// }
JSONObject jsonObject = JSONObject.fromObject(map);
JSONObject jsonMaptop = JSONObject.fromObject(maptop);
//System.out.println(jsonMaptop);
String key = maptop.get("symbols") + "#" + maptop.get("pricefalls");
// System.out.println(maptop.get("pricefalls"));
// System.out.println(maptop.get("symbols"));
keyLs.add(key);
allMap.put(key, jsonMaptop);
jedis.set("6_"+jsonMaptop.get("symbols"),jsonMaptop.toString());
}
//end = System.currentTimeMillis();
//System.out.println("================解析DBF=" + (end - begin) / 1000.0);
//begin = System.currentTimeMillis();
Collections.sort(keyLs, new Comparator<String>() {
public int compare(String arg0, String arg1) {
arg0 = arg0.substring(arg0.indexOf("#") + 1);
BigDecimal a = new BigDecimal(arg0);
arg1 = arg1.substring(arg1.indexOf("#") + 1);
BigDecimal b = new BigDecimal(arg1);
return b.compareTo(a);
}
});
// end = System.currentTimeMillis();
//
// System.out.println("================排序" + (end - begin) / 1000.0);
// System.out.println(keyLs);
// System.out.println(keyLs.size());
//begin = System.currentTimeMillis();
int size = keyLs.size();
int last = size - 31;
int c = 29;
for (int j = 0; j < size; j++) {
String key = keyLs.get(j);
if (j < 30) {
top30Map.put("top_"+j+"_"+key.substring(0,key.indexOf("#")), allMap.get(key));
} else if (j > last) {
last30Map.put("last_"+c+"_"+key.substring(0,key.indexOf("#")), allMap.get(key));
c--;
}
}
// end = System.currentTimeMillis();
//
// System.out.println("================存储排行" + (end - begin) / 1000.0);
System.out.println(top30Map.keySet());
System.out.println(last30Map.keySet());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
}
public static void main(String[] args) {
Rwdbf rdbf = new Rwdbf();
String path = "E:\\SJSHQ.DBF";
setup();
rdbf.readDBF(path);
}
}