Java CSV 解析和分钟窗口聚合计算
以下是使用 Java 实现解析 CSV 文件并按分钟窗口聚合计算字段的代码示例:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class CSVParser {
public static void main(String[] args) {
String csvFile = '600570.csv';
String line;
String cvsSplitBy = ',';
SimpleDateFormat dateFormat = new SimpleDateFormat('HH:mm');
Map<String, MinuteData> minuteDataMap = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
while ((line = br.readLine()) != null) {
String[] data = line.split(cvsSplitBy);
// Extract relevant fields from the CSV line
Date timestamp = dateFormat.parse(data[0]);
double last_px = Double.parseDouble(data[1]);
int business_count = Integer.parseInt(data[2]);
double business_amount = Double.parseDouble(data[3]);
double business_balance = Double.parseDouble(data[4]);
// Check if the timestamp is within the trading hours
Calendar calendar = Calendar.getInstance();
calendar.setTime(timestamp);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
if ((hour == 9 && minute >= 30) || (hour == 10) || (hour == 11 && minute <= 30)
|| (hour == 13) || (hour == 14) || (hour == 15 && minute == 0)) {
// Get the minute key for the current timestamp
String minuteKey = String.format('%02d:%02d', hour, minute);
// Check if the minute key already exists in the map
if (minuteDataMap.containsKey(minuteKey)) {
MinuteData minuteData = minuteDataMap.get(minuteKey);
minuteData.update(last_px, business_count, business_amount, business_balance);
} else {
MinuteData minuteData = new MinuteData(last_px);
minuteData.update(last_px, business_count, business_amount, business_balance);
minuteDataMap.put(minuteKey, minuteData);
}
}
}
// Print the aggregated minute data
for (Map.Entry<String, MinuteData> entry : minuteDataMap.entrySet()) {
String minuteKey = entry.getKey();
MinuteData minuteData = entry.getValue();
System.out.println('Minute: ' + minuteKey);
System.out.println('Open_px: ' + minuteData.getOpen_px());
System.out.println('High_px: ' + minuteData.getHigh_px());
System.out.println('Low_px: ' + minuteData.getLow_px());
System.out.println('Close_px: ' + minuteData.getClose_px());
System.out.println('Business_count: ' + minuteData.getBusiness_count());
System.out.println('Business_amount: ' + minuteData.getBusiness_amount());
System.out.println('Business_balance: ' + minuteData.getBusiness_balance());
System.out.println('---------------------------------------------');
}
} catch (IOException | ParseException e) {
e.printStackTrace();
}
}
static class MinuteData {
private double open_px;
private double high_px;
private double low_px;
private double close_px;
private int business_count;
private double business_amount;
private double business_balance;
public MinuteData(double open_px) {
this.open_px = open_px;
this.high_px = open_px;
this.low_px = open_px;
}
public double getOpen_px() {
return open_px;
}
public double getHigh_px() {
return high_px;
}
public double getLow_px() {
return low_px;
}
public double getClose_px() {
return close_px;
}
public int getBusiness_count() {
return business_count;
}
public double getBusiness_amount() {
return business_amount;
}
public double getBusiness_balance() {
return business_balance;
}
public void update(double last_px, int business_count, double business_amount, double business_balance) {
this.close_px = last_px;
this.high_px = Math.max(this.high_px, last_px);
this.low_px = Math.min(this.low_px, last_px);
this.business_count += business_count;
this.business_amount += business_amount;
this.business_balance += business_balance;
}
}
}
请确保将上述代码中的'600570.csv'替换为你实际的CSV文件路径。代码会解析CSV文件并根据分钟窗口聚合计算并打印相关字段(open_px、high_px、low_px、close_px、business_count、business_amount和business_balance)的值。
原文地址: http://www.cveoy.top/t/topic/S7L 著作权归作者所有。请勿转载和采集!