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;
    }
  }
}
4

1 回答 1

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");
}

草图首先检查文件是否存在。如果没有,它会创建一个新表,否则它会将旧表与其标题一起加载。请注意,这不是特别安全...如果您更改列(例如,在文本编辑器中)并尝试再次运行草图,您将遇到异常。

于 2013-09-23T09:40:58.123 回答