所以我试图在CSV中对大量数据进行排序。文件。该文件包含公司的一定数量的信息,但有1000多家公司。例如,我可能需要通过1000家公司,能够获得他们的年度收入,当前股票价值,CEO等等。每家公司将提供相同的信息(相同数量的逗号但不同的字符长度),但是该文件是CSV。公司名称和信息均以逗号分隔。
目前我正在通过信息之间的逗号将csv文件拆分为数组。但我希望能够将这些信息与公司保持在一起,并能够根据给定的信息和公司名称进行指定,调用和排序。但是因为我已经通过逗号分隔了这些信息,所有这些信息已经列在了listarray中。
那么是否可以在大规模上指定每15个逗号(或listarray中的分裂)应该重新连接在一起?这样,listarray的每个部分都是一个独立的公司。或者是否有另一种方法来分离数据,以便信息不被分割?
注意:csv文件中没有相似之处可以让我分割信息,以便在每个公司信息之后拆分。
这里是一个csv文件的样本。
"Tiffany & Co. Com",964270,"+0.81","1/14/2014",88.97,93.64,"87.795 - 88.97""Asia Pacific Fund",20700,"+0.04","1/14/2014",10.23,11.37,"10.19 - 10.23""Anadarko Petroleu",4236380,"+2.47","1/14/2014",80.99,98.47,"78.40 - 80.99""Proto Labs, Inc. ",451984,"-0.18","1/14/2014",73.83,89.97,"71.00 - 73.83""Zuoan Fashion Lim",201560,"-0.02","1/14/2014",1.79,3.62,"1.71 - 1.79"
答案 0 :(得分:0)
public class Read{
String original = "";
String company = "";
String otherValue = "";
public Read(String read){
//here Split the original string into the values
}
//public void getters and setters
}
然后创建一个读取对象数组并根据需要对它们进行排序
答案 1 :(得分:0)
一个想法是将CSV解析为对象,然后对这些对象进行排序。该对象将“知道”它由CSV组成的字段数以及如何解析每个字段。使用StringTokenizer进行解析并使用TreeMap进行排序将类似于:
...
BufferedReader reader = new BufferedReader(new FileReader("somedata.csv"));
TreeMap<String, MyObject> map = new TreeMap<>();
String line = reader.readLine();
StringTokenizer tokens = new StringTokenizer(line,",");
while(tokens.hasMoreTokens()) {
MyObject obj = new MyObject(tokens);
//add the objects to the sorted map, where field1 is what we sort on
map.put(obj.field1, obj);
}
...
}
static class MyObject {
//would need the same number of fields as you want to group
String field1;
String field2;
//... so with 2 fields, input is field1,field2,field1,field2,...
MyObject (StringTokenizer input) {
this.field1 = input.nextToken();
this.field2 = input.nextToken();
}
}
答案 2 :(得分:0)
我同意将每行CSV转换为Java对象。 但传统的解析机制对我来说太冗长了,我可能需要处理太多条件,例如引号之间的逗号,带有多行描述的列中的换行符。所以我建议你使用像supercsv这样现有的超棒解决方案。
我还为它编写了一个包装器,以方便开发人员。
QuickOCM会让你这样做。
创建公司类
public class Company {
/* this specifies that
* it is a mandatory field in the csv,
* of header name "Company Name" and
* of type string.
* Header is the first line of the csv.
*/
@ImportField(mandatory = true, name = "Company Name", type = "String")
public String name;
@ImportField(mandatory = true, name = "Name of the CEO", type = "String")
public String ceoName;
}
您需要公共getter-setter或公共字段,任何工作
创建csv解析器,处理每一行的处理程序,可能添加到要排序的列表,然后调用解析
final List<Company> companies = new ArrayList<Company>();
csvParser.process(inputStream, Company.class, new RecordHandler<Company>() {
@Override
public void execute(Company imported, int rowNumber, Map supplementaryInfo) {
companies.add(imported);
}
});
现在,您可以使用排序列表实现对列表进行排序,也可以使用比较器。
有关详细信息,您可以查看QuickOCM page。