Java 解析设计糟糕的csv文件(动态结构)

Java 解析设计糟糕的csv文件(动态结构),java,parsing,csv,Java,Parsing,Csv,我需要一些帮助来解析设计糟糕的csv(逗号分隔值)文件。该文件包含每2.5秒更新一次的当前气象数据。以下是文件的结构: 1.00 - Csv File Version ID (XX.XX) Floating Point 2012 - Year (yyyy format) Integer 10 - Month Integer 31 - Day Integer 10 - Hour (24-hour format) Integer 58 - Minute Integer 45 - Second Int

我需要一些帮助来解析设计糟糕的csv(逗号分隔值)文件。该文件包含每2.5秒更新一次的当前气象数据。以下是文件的结构:

1.00 - Csv File Version ID (XX.XX) Floating Point
2012 - Year (yyyy format) Integer
10 - Month Integer
31 - Day Integer
10 - Hour (24-hour format) Integer
58 - Minute Integer
45 - Second Integer
2 - Wind speed 10min average (mph) Floating Point
3 - Wind speed (mph) Floating Point
103 - Wind Direction(degrees) Floating Point
48 - Inside Humidity (%) Floating Point
91 - Outside Humidity (%) Floating Point
67,5 - Inside Temperature (°F) Floating Point
36,5 - Outside Temperature (°F) Floating Point
29,867 - Barometer (in) Floating Point
35,969 - Total Rain (in) Floating Point
0,00 - Daily Rain (in) Floating Point
下面是一个实际记录的示例:

1.00,2012,11,3,18,36,16,3,4,281,49,74,73,1,55,5,29,890,37,055,0,00
现在我已经用Java编写了解析器。我正在使用另外两个库:

  • JodaTime 2.1
  • OpenCSV2.3

    // First we read file.
    CSVReader reader = new CSVReader(new FileReader("/VPLive/data.csv"));`
    
    List<String[]> data = reader.readAll();
    reader.close();
    
    // Actual data is in first element, which contains string array.
    String[] records = data.get(0);
    
    // First we parse date and time.
    DateTime dateTime= new DateTime(Integer.parseInt(records[1]), Integer.parseInt(records[2]), Integer.parseInt(records[3]), Integer.parseInt(records[4]), Integer.parseInt(records[5]), Integer.parseInt(records[6]));
    
    // Then we parse air temperature.
    double airTemperatureFahrenheit = Double.parseDouble(records[14] + "." + records[15]);
    
    //首先我们读取文件。
    CSVReader reader=newcsvreader(newfilereader(“/VPLive/data.csv”)`
    List data=reader.readAll();
    reader.close();
    //实际数据位于第一个元素中,该元素包含字符串数组。
    String[]records=data.get(0);
    //首先,我们解析日期和时间。
    DateTime DateTime=new DateTime(Integer.parseInt(记录[1])、Integer.parseInt(记录[2])、Integer.parseInt(记录[3])、Integer.parseInt(记录[4])、Integer.parseInt(记录[5])、Integer.parseInt(记录[6]);
    //然后我们分析空气温度。
    double airTemperatureFahrenheit=double.parseDouble(记录[14]+“+”+记录[15]);
    
现在这种方法的问题是,文件用逗号将固定值和十进制值分开。现在这是可以解的,正如我在代码示例中所展示的空气温度但是要得到这个

例如,当空气温度为55°F时,它仅打印55。固定值后没有小数点零。风速也是如此。可以具有小数点值的值包括:

  • 平均风速10分钟
  • 风速(英里/小时)
  • 内部温度(°F)
  • 室外温度(华氏度)
因此有4^2=16个不同文件结构的组合。我现在陷入困境,因为我不知道如何解决这个问题。我正在考虑设置参考点,例如,我知道气压计必须在给定的时间间隔内

编辑:
我忘了提。data.csv中的单行每2.5s不断被覆盖。所以我看不到以前的值。但我的档案中每1分钟就有一个值。但我需要在每次更新时读取该文件,因为我正在实现实时功能。

如果该文件每隔2.5秒读取一次,则可以使用最后一次读取作为参考点,更改应该最小。要获得第一次读数,是的,你需要一些“合理值”参考点,以确保第一次获得有效数据。我认为这是错误的。风每2.5s更新一次,温度每5s更新一次。这是踢球的人。我怎么知道我什么时候开始阅读的条件是什么?此外,我还稍微更新了我的问题。如果温度在2次读数(即5秒)中保持恒定,那么在其他读数的“中间”处,每2次读数就有2个恒定值。这将在一定程度上限制组合。另外,风向和湿度有相当明显的限制。风向和湿度不是问题。这些值始终是固定的。但是,当我启动定期读取此文件的程序时,我如何获得参考点?只是澄清一下,你是说并不总是有22个字段吗?i、 e.在十进制值为整数的情况下,实际上字段较少,因为它不放0,所以会完全忽略记录。这和问题非常相似,但你们有两种以上的可能性,这使得问题变得更加困难!