2013-03-25 35 views
1

我正在编写一个程序来解析一堆数据,(你可以在这里得到一个数据集本身的例子:https://explore.data.gov/Geography-and-Environment/Worldwide-M1-Earthquakes-Past-7-Days/7tag-iwnu)。为什么我需要调用find()两次?

以下班级完全正常,但我不确定为什么我需要在我的parseEarthquake()方法中的每个项目之间拨打matcher.find()额外的时间。这是为什么?这是我必须处理的一个正常的怪癖,还是我错误地设置了我的模式/匹配器?

该方法采用包含其中一行数据的字符串(例如,nc,71958020,1,"Thursday, March 21, 2013 17:13:34 UTC",38.8367,-122.8298,1.4,2.60,28,"Northern California"),并返回数据的地震对象。

import java.text.DecimalFormat; 
import java.text.FieldPosition; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.TimeZone; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class Earthquake { 

    String src="xx"; 
    String eqid="00000000"; 
    short version; 
    long dateTime; 
    float lat, lon; 
    float mag, dep; 
    short nst; 
    String region="Nowhere"; 

    private Earthquake(){ 
     date.setTimeZone(TimeZone.getTimeZone("UTC")); 
    } 



    private static DecimalFormat 
      coords  = new DecimalFormat("##0.0000"), 
      magnitude = new DecimalFormat("###0.0"), 
      depth  = new DecimalFormat("###0.00"); 
    private static SimpleDateFormat date = new SimpleDateFormat("'\"'EEEE', 'MMMM' 'dd', 'yyyy' 'HH':'mm':'ss' 'zzz'\"'"); 


    // Src, Eqid, Version, Datetime, Lat, Lon, Magnitude, Depth, NST, Region; 

    public static Earthquake parseEarthquake(String string){ 
     Earthquake result = new Earthquake(); 

     Matcher matcher = Pattern.compile("(\".*?\")|([^,]*)").matcher(string); 


     try { 

           matcher.find(); result.src = matcher.group(); 
       matcher.find(); matcher.find(); result.eqid = matcher.group(); 
       matcher.find(); matcher.find(); result.version = Short.parseShort(matcher.group()); 
       matcher.find(); matcher.find(); result.dateTime = date.parse(matcher.group()).getTime(); 
       matcher.find(); matcher.find(); result.lat = coords.parse(matcher.group()).floatValue(); 
       matcher.find(); matcher.find(); result.lon = coords.parse(matcher.group()).floatValue(); 
       matcher.find(); matcher.find(); result.mag = magnitude.parse(matcher.group()).floatValue(); 
       matcher.find(); matcher.find(); result.dep = depth.parse(matcher.group()).floatValue(); 
       matcher.find(); matcher.find(); result.nst = Short.parseShort(matcher.group()); 
       matcher.find(); matcher.find(); result.region = matcher.group();  

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } catch (NumberFormatException e) { 
      e.printStackTrace(); 
     } 

     return result; 
    } 

    public String toString(){ 
     StringBuffer buf = new StringBuffer(); 

          buf.append(src); 
     buf.append(','); buf.append(eqid); 
     buf.append(','); buf.append(version); 
     buf.append(','); date.format(dateTime, buf, new FieldPosition(0)); 
     buf.append(','); coords.format(lat, buf, new FieldPosition(0)); 
     buf.append(','); coords.format(lon, buf, new FieldPosition(0)); 
     buf.append(','); magnitude.format(mag, buf, new FieldPosition(0)); 
     buf.append(','); depth.format(dep, buf, new FieldPosition(0)); 
     buf.append(','); buf.append(nst); 
     buf.append(','); buf.append('"'); buf.append(region); buf.append('"'); 

     return buf.toString(); 

    } 
} 
+0

顺便说一句,正如你可能已经猜到的那样,我还有其他一些我计划添加到课堂上的东西。这绝不是完全完成的。 – AJMansfield 2013-03-25 18:15:13

+2

如果您使用库来读取CSV文件格式,则可以删除大部分代码(和错误)。 – 2013-03-25 18:15:47

+0

@IvanNevostruev是java标准库的库部分?我打算最终将其作为processing.org草图的一部分,因此如果它不是标准库,可能会证明它非常困难。 – AJMansfield 2013-03-25 18:18:58

回答

2

变化([^,]*)([^,]+),因为前者会始终保持一致 - 即使它只是没有匹配。

相关问题