Java 将GitHub问题下载到.csv文件
GitHub使用EclipseGit发布下载,但不返回任何内容 最近,我一直在尝试创建一个java桌面应用程序(用于windows),它将从特定的GitHub问题存储库下载GitHub问题,并将它们保存在.csv文件中 我已经使用Swing创建了一个简单的GUI来启用存储库名称的输入。我还使用eclipse的egit库建立到GitHub的连接,以便下载问题。我使用身份验证,使用.properties文件输入,以验证egit与GitHub的连接 以下是我的应用程序用于下载问题并将其写入.csv文件的主要代码:Java 将GitHub问题下载到.csv文件,java,csv,github,egit,github-api,Java,Csv,Github,Egit,Github Api,GitHub使用EclipseGit发布下载,但不返回任何内容 最近,我一直在尝试创建一个java桌面应用程序(用于windows),它将从特定的GitHub问题存储库下载GitHub问题,并将它们保存在.csv文件中 我已经使用Swing创建了一个简单的GUI来启用存储库名称的输入。我还使用eclipse的egit库建立到GitHub的连接,以便下载问题。我使用身份验证,使用.properties文件输入,以验证egit与GitHub的连接 以下是我的应用程序用于下载问题并将其写入.csv文件
package io.github.psgs.issuesdownload;
import io.github.psgs.issuesdownload.gui.GUI;
import org.eclipse.egit.github.core.Issue;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.service.IssueService;
import java.io.FileWriter;
import java.io.IOException;
public class IssuesDownload {
public static void main(String[] args) {
try {
Config.loadConfiguration();
} catch(IOException ex) {
}
GUI.main(args);
}
public static String saveIssues(String repoDetails) {
String[] repoInfo = repoDetails.split("/");
String repoOwner = repoInfo[0];
String repoName = repoInfo[1];
GitHubClient client = new GitHubClient();
client.setCredentials(Config.githubuser, Config.githubpass);
IssueService issueService = new IssueService(client);
try {
FileWriter writer = new FileWriter("issues.csv");
//String[] header = {"Id", "Title", "Creator", "Assignee", "Milestone", "State", "Body Text"};
writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
writer.append("\n");
for (Issue issue : issueService.getIssues(repoOwner, repoName, null)) {
//String[] data = {String.valueOf(issue.getId()), issue.getTitle(), issue.getUser().getName(), issue.getAssignee().getName(), issue.getMilestone().getTitle(), issue.getState(), issue.getBodyText()};
writer.append(String.valueOf(issue.getId()) + ",");
writer.append(issue.getTitle() + ",");
writer.append(issue.getUser().getName() + ",");
writer.append(issue.getAssignee().getName() + ",");
writer.append(issue.getMilestone().getTitle() + ",");
writer.append(issue.getState() + ",");
writer.append(issue.getBodyText());
writer.append("\n");
}
writer.flush();
writer.close();
return "Download Complete!";
} catch (IOException ex) {
System.out.println("An IOException has occured!");
ex.printStackTrace();
if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
return "An error has occured, reaching " + ex.getMessage() + "! Please check your network connection.";
}
}
return "An error has occured!";
}
}
此代码也可从以下网址获得:
整个存储库可在以下位置找到:
当我运行此代码时,.properties文件与compile.jar文件位于同一目录中,GitHub问题不会出现在.csv文件中。我已经测试了.csv文件输出,当我删除下载代码时,头正确写入
有人知道为什么会这样吗?可能是我遗漏了一个身份验证问题?看起来您使用的方法是用来检索问题的 也许(在项目的存储库中)会有帮助。我看到的唯一区别是,您没有传递一个
singletonMap
,我不确定您是否必须传递。公共静态void outputCsv(字符串文件名,字符串[]headerName,
public static <T> void outputCsv(String fileName, String[] headerName,
List<T> listResult, HttpServletRequest request) {
HttpServletResponse response = ResponseUtil.getResponse();
OutputStream out;
try {
// Encode file name
fileName = Util.encodeUnicodeFile(fileName, request);
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/octet-stream; charset="
+ Constant.CONST_SJIS_ENCODING);
response.setHeader("Content-disposition", "attachment; filename=\""
+ fileName + "\"");
response.setCharacterEncoding(Constant.CONST_SJIS_ENCODING);
out = response.getOutputStream();
CSVWriter writer = new CSVWriter(new OutputStreamWriter(out,
Constant.CONST_WINDOW_JAPAN_ENCODING),
Constant.CONST_CSV_SEPARATOR_COMMA);
// Convert list result data to List <String[]>
List<String[]> list = convertListDataToCsvArray(listResult,
headerName);
// Write list data
writer.writeAll(list);
writer.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static <T> List<String[]> convertListDataToCsvArray(
List<T> listResult, String[] headerName) {
List<String[]> listCsv = new ArrayList<String[]>();
// First row is header
listCsv.add(headerName);
for (T object : listResult) {
// Get all fields of object
Field[] fields = object.getClass().getFields();
// Init row
String[] row = new String[headerName.length];
int index = 0;
for (Field field : fields) {
try {
if (field.getType().equals(Long.class)) {
// Read field value and set to string array
Long value = (Long) field.get(object);
row[index] = value != null ? String.valueOf(value) : "";
} else if (field.getType().equals(String.class)) {
// Read field value and set to string array
String value = (String) field.get(object);
row[index] = value != null ? value : "";
} else if (field.getType().equals(BigDecimal.class)) {
// Read field value and set to string array
BigDecimal value = (BigDecimal) field.get(object);
row[index] = value != null ? String.valueOf(value) : "";
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
index++;
}
// Add row
listCsv.add(row);
}
return listCsv;
}
列表列表结果,HttpServletRequest请求){
HttpServletResponse=ResponseUtil.getResponse();
输出流输出;
试一试{
//编码文件名
fileName=Util.encodeUnicode文件名(文件名,请求);
response.setStatus(HttpServletResponse.SC_OK);
setContentType(“应用程序/八位字节流;字符集=”
+常量(常量编码);
response.setHeader(“内容处置”、“附件;文件名=\”)
+文件名+“\”);
响应.setCharacterEncoding(常量.CONST_SJIS_编码);
out=response.getOutputStream();
CSVWriter writer=新的CSVWriter(新的OutputStreamWriter(输出,
常数。常数(窗口编码),
常量(常量、CSV、分隔符、逗号);
//将列表结果数据转换为列表
List List=CONVERTLISTDATOCSVARRAY(listResult,
头名);
//写列表数据
writer.writeAll(列表);
writer.close();
out.close();
}捕获(例外e){
e、 printStackTrace();
}
}
私有静态列表convertListDataToCsvArray(
列表结果,字符串[]标题名称){
List listCsv=新建ArrayList();
//第一行是标题
listcv.add(headerName);
for(T对象:listResult){
//获取对象的所有字段
Field[]fields=object.getClass().getFields();
//初始行
String[]行=新字符串[headerName.length];
int指数=0;
用于(字段:字段){
试一试{
if(field.getType().equals(Long.class)){
//读取字段值并设置为字符串数组
Long value=(Long)field.get(object);
行[index]=value!=null?字符串。valueOf(value):“”;
}else if(field.getType().equals(String.class)){
//读取字段值并设置为字符串数组
字符串值=(字符串)字段。获取(对象);
行[索引]=值!=空?值:“”;
}else if(field.getType().equals(BigDecimal.class)){
//读取字段值并设置为字符串数组
BigDecimal值=(BigDecimal)字段。获取(对象);
行[index]=value!=null?字符串。valueOf(value):“”;
}
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}
索引++;
}
//添加行
添加(行);
}
返回列表CSV;
}
在尝试了一些新的API包装后,我发现了一个可以工作的API库。我现在使用连接到GitHub
<dependency>
<groupId>org.kohsuke</groupId>
<artifactId>github-api</artifactId>
<version>1.49</version>
</dependency>
存储库是否可能没有问题,或者您提供的存储库是否错误?我假设头行总是在文件中,您只是看不到任何其他数据。我尝试了多个存储库,并检查了我使用的存储库中是否存在未解决的问题。我也尝试过使用封闭存储库。getOpenIssues使用整数返回存储库中的问题数。我正在寻找一种方法,用存储库实际返回问题对象。也许IssueService中有一种方法?@psgs我更新了我的答案。我错过了
getOpenIssues
返回计数的消息。我在项目中发现了一个测试,它与您正在做的事情类似。这些评论表明它可能就是你要找的。非常感谢你对这个问题的回答!不幸的是,这个答案没有以安全的方式使用GitHub API,并且使用了一些我宁愿避免的长方法。谢谢,psgs。
package io.github.psgs.issuesdownload;
import io.github.psgs.issuesdownload.gui.GUI;
import org.kohsuke.github.GHIssue;
import org.kohsuke.github.GHIssueState;
import org.kohsuke.github.GHRepository;
import org.kohsuke.github.GitHub;
import java.io.FileWriter;
import java.io.IOException;
public class IssuesDownload {
public static void main(String[] args) {
try {
Config.loadConfiguration();
} catch (IOException ex) {
System.out.println("An IOException had occured while loading the configuration!");
ex.printStackTrace();
}
GUI.main(args);
}
public static String saveIssues(String repoDetails, GHIssueState issueState) {
String[] repoInfo = repoDetails.split("/");
try {
GitHub github = GitHub.connectUsingOAuth(Config.githubtoken);
GHRepository repository = github.getUser(repoInfo[0]).getRepository(repoInfo[1]);
FileWriter writer = new FileWriter("issues.csv");
writer.append("Id, Title, Creator, Assignee, Milestone, State, Body Text");
writer.append("\n");
for (GHIssue issue : repository.getIssues(issueState)) {
writer.append(String.valueOf(issue.getNumber()) + ",");
writer.append(issue.getTitle() + ",");
writer.append(issue.getUser().getLogin() + ",");
if (issue.getAssignee() != null) {
writer.append(issue.getAssignee().getName() + ",");
} else {
writer.append(" ,");
}
if (issue.getMilestone() != null) {
writer.append(issue.getMilestone().getTitle() + ",");
} else {
writer.append(" ,");
}
writer.append(issue.getState() + ",");
writer.append(issue.getBody() + ",");
writer.append("\n");
}
writer.flush();
writer.close();
return "Download Complete!";
} catch (IOException ex) {
System.out.println("An IOException has occured!");
ex.printStackTrace();
if (ex.getMessage().equalsIgnoreCase("api.github.com")) {
return "An error has occurred reaching " + ex.getMessage() + "! Please check your network connection.";
}
}
return "An error has occured!";
}
}