Csv 如何在处理中附加结果?
为了保存应用程序生成的结果,我实现了Table()函数。但是,应用程序中的计时器函数似乎会导致应用程序在每次运行时写入现有的CSV文件。我希望将最新的搜索结果附加到现有的CSV文件中,而不是覆盖现有的CSV文件。有办法做到这一点吗?如果结果以不同的格式(如JSON)存储,是否更容易附加结果Csv 如何在处理中附加结果?,csv,twitter,processing,twitter4j,Csv,Twitter,Processing,Twitter4j,为了保存应用程序生成的结果,我实现了Table()函数。但是,应用程序中的计时器函数似乎会导致应用程序在每次运行时写入现有的CSV文件。我希望将最新的搜索结果附加到现有的CSV文件中,而不是覆盖现有的CSV文件。有办法做到这一点吗?如果结果以不同的格式(如JSON)存储,是否更容易附加结果 Timer timer; import java.util.List; Table table; long lastID = Long.MAX_VALUE; void setup() { timer
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;
}
}
}
定时器;
导入java.util.List;
表格;
long lastID=long.MAX_值;
无效设置(){
定时器=新定时器(30000);
timer.start();
goTwitter();
table=新表();
表.添加列(“id”);
表.添加列(“纬度”);
表.添加列(“经度”);
}
作废提款(){
if(timer.isFinished()){
goTwitter();
timer.start();
}
}
void goTwitter(){
ConfigurationBuilder cb=新的ConfigurationBuilder();
cb.setOAuthConsumerKey(“”);
cb.SetOAuthConsumerCret(“”);
cb.setOAuthAccessToken(“”);
cb.setOAuthAccessTokenSecret(“”);
Twitter=newtwitterfactory(cb.build()).getInstance();
查询=新查询(“#爱”);
int numberOfTweets=300;
ArrayList tweets=新建ArrayList();
while(tweets.size()100)
query.setCount(100);
其他的
setCount(numberOfTweets-tweets.size());
//long lastID=long.MAX_值;
试一试{
QueryResult result=twitter.search(查询);
addAll(result.getTweets());
println(“收集的”+tweets.size()+tweets”);
对于(状态t:tweets)
如果(t.getId()总时间){
返回true;
}否则{
返回false;
}
}
}
好吧,似乎没有一个直接的实现可以附加到表中,因此您必须求助于一个黑客:在处理过程中加载表,写入并重新保存,类似这样:
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");
}
草图首先检查文件是否存在。如果没有,它将创建一个新表,否则它将加载旧表及其标题。
请注意,这不是特别安全。。。如果更改列(例如,在文本编辑器中)并尝试再次运行草图,则会出现异常