我正在尝试解析像这样的csv字符串
COL1,COL2,COL3
1,2,3
2,4,5
并将列映射到java对象 -
Class Person{
COL1,
COL2,
COL3;
}
我在google上找到的大多数库都是针对csv文件的,但我正在使用谷歌应用引擎,因此无法写入或读取文件。目前我正在使用拆分方法,但这种方法的问题是
列可能会有所不同
COL1,COL3,COL2
不想使用拆分和获取每列的样板代码。所以我需要的是列标题列表,并使用标题映射器读取集合中的所有列。迭代时,将列值映射到java对象。
基于相似类型的要求有几个问题,但它们都没有帮助我。 如果有人这样做过,请你分享一下这个想法吗?谢谢!
答案 0 :(得分:2)
在搜索并尝试了几个库后,我能够解决它。如果有人以后需要,我会分享代码 -
public class CSVParsing {
public void parseCSV() throws IOException {
List<Person> list = Lists.newArrayList();
String str = "COL1,COL2,COL3\n" +
"A,B,23\n" +
"S,H,20\n";
CsvSchema schema = CsvSchema.emptySchema().withHeader();
ObjectReader mapper = new CsvMapper().reader(Person.class).with(schema);
MappingIterator<Person> it = mapper.readValues(str);
while (it.hasNext()) {
list.add(it.next());
}
System.out.println("stored list is:" + (list != null ? list.toString() : null));
}}
答案 1 :(得分:0)
使用Tokenizer将字符串拆分为对象,然后将其设置为对象。
//Split the string into tokens using a comma as the token seperator
StringTokenizer st = new StringTokenizer(lineFromFile, ",");
while (st.hasMoreTokens())
{
//Collect each item
st.nextElement();
}
//Set to object
Person p = new Person(item1, item2, item3);
如果可以反转列,则解析标题行,保存其值并使用它来决定每个令牌使用哪个列,例如Map
String columns[] = new String[3]; //Fill these with column names
Map<String,String> map = new HashMap<>();
int i=0;
while (st.hasMoreTokens())
{
//Collect each item
map.put(columns[i++], st.nextElement());
}
然后,创建Person
Person p = new Person(map.get("COL1"), map.get("COL2"), map.get("COL3"));
答案 2 :(得分:0)
我在google上找到的大多数库都是用于csv文件,但我是 使用谷歌应用引擎,因此无法写入或读取文件
您可以读取文件(在项目文件系统中)。 您可以在blobstore中读取和写入文件,谷歌云存储