2013-09-23 47 views
2

我已经实现了Table()函数以保存应用程序生成的结果。但是,应用程序中的Timer函数似乎会导致应用程序在每次运行时都覆盖现有的CSV文件。我不想写现有的CSV文件,而是想将最新的搜索结果附加到现有的CSV文件中。有没有办法做到这一点?如果结果以不同的格式(如JSON)存储,那么追加结果会更容易一些吗?如何在处理中附加结果?

Timer timer; 
import java.util.List; 
Table table; 
long lastID = Long.MAX_VALUE; 

void setup() { 

    timer = new Timer(30000); 
    timer.start(); 
    goTwitter(); 

    table = new Table(); 
    table.addColumn("id"); 
    table.addColumn("latitude"); 
    table.addColumn("longitude"); 

} 

void draw(){ 
    if (timer.isFinished()){ 
    goTwitter(); 
    timer.start(); 
    } 
} 

void goTwitter(){ 

    ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setOAuthConsumerKey(""); 
    cb.setOAuthConsumerSecret(""); 
    cb.setOAuthAccessToken(""); 
    cb.setOAuthAccessTokenSecret(""); 


Twitter twitter = new TwitterFactory(cb.build()).getInstance(); 
    Query query = new Query("#love"); 
    int numberOfTweets = 300; 
    ArrayList<Status> tweets = new ArrayList<Status>(); 
    while (tweets.size() < numberOfTweets) { 
    if (numberOfTweets - tweets.size() > 100) 
     query.setCount(100); 
    else 
     query.setCount(numberOfTweets - tweets.size()); 
     //long lastID = Long.MAX_VALUE; 
    try { 
     QueryResult result = twitter.search(query); 
     tweets.addAll(result.getTweets()); 
     println("Gathered " + tweets.size() + " tweets"); 
     for (Status t: tweets) 
     if(t.getId() < lastID) lastID = t.getId(); 
    } 
    catch (TwitterException te) { 
     println("Couldn't connect: " + te); 
    }; 
    query.setSinceId(lastID); 

    } 
    for (int i = 0; i < tweets.size(); i++) { 
    Status t = (Status) tweets.get(i); 

    GeoLocation loc = t.getGeoLocation(); 

    String user = t.getUser().getScreenName(); 
    String msg = t.getText(); 
    String time = ""; 
    if (loc!=null) { 
     Double lat = t.getGeoLocation().getLatitude(); 
     Double lon = t.getGeoLocation().getLongitude(); 
     println(i + " USER: " + user + " wrote: " + msg + " located at " + lat + ", " + lon); 

    TableRow newRow = table.addRow(); 
    newRow.setString("id", user); 
    newRow.setDouble("latitude", lat); 
    newRow.setDouble("longitude", lon); 

    saveTable(table, "data2/syria_16500_5.csv");  
    } 
    } 
    println("lastID= " + lastID); 
} 

class Timer { 
    int savedTime; 
    int totalTime; 

    Timer (int tempTotalTime) { 
    totalTime = tempTotalTime; 
    } 

    void start(){ 
    savedTime = millis(); 
    } 

boolean isFinished() { 
    int passedTime = millis() - savedTime; 
    if (passedTime > totalTime){ 
     return true; 
    } else { 
     return false; 
    } 
    } 
} 

回答

1

好了,似乎没有成为一个直接实施追加到一个表,所以你必须求助于黑客:加载表处理,写它,并重新保存,排序像这样:

processing.data.Table table; 
void setup() { 
    File f = new File(sketchPath("") + "data2/syria_16500_5.csv"); 
    println(f.getAbsolutePath()); 
    if (!f.exists()) { 
    table = new processing.data.Table(); 
    table.addColumn("id"); 
    table.addColumn("latitude"); 
    table.addColumn("longitude"); 
    } 
    else 
    table = loadTable("data2/syria_16500_5.csv", "header, csv"); 
    TableRow newRow = table.addRow(); 
    newRow.setString("id", "asad"); 
    newRow.setDouble("latitude", 234); 
    newRow.setDouble("longitude", 2523); 

    saveTable(table, "data2/syria_16500_5.csv"); 
} 

草图首先检查文件是否存在。如果没有,它会创建一个新表,否则它会将旧表加载到其标题中。 被警告,这不是特别安全......如果你改变了你的列(比如说在一个文本编辑器中)并且尝试再次运行草图,你将会得到一个异常。