cSVファイルを解析して、その内容を配列に格納する方法を知りたいです。私のcsvファイルは次のようになります。
1,bulbasaur,1,7,69,64,1,1
2,ivysaur,2,10,130,142,2,1
名前だけが必要なので、2番目のフィールドです。これらのすべての項目をcsvに格納して、文字列の配列または配列リストに格納します。
これを行う方法はありますか?
どんな助けでも大歓迎です!
AndroidでCSVファイルを配置する場所「res」フォルダー内に「raw」という名前のフォルダーを作成し、その中にCSVファイルを配置します。
CSVファイルの読み方、Android以来特別なものはありません。標準のJavaコードを使用します。APIに移動するのではなく、独自のコードを使用する方が適切です。次のクラスは、CSVファイルを読み取るためのユーティリティであり、CSVファイル内から使用できますAndroid application。csvファイルのアイテムを格納する配列これらの例では、これはscorelist arraylistです。
public class CSVFile {
InputStream inputStream;
public CSVFile(InputStream inputStream){
this.inputStream = inputStream;
}
public List read(){
List resultList = new ArrayList();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String csvLine;
while ((csvLine = reader.readLine()) != null) {
String[] row = csvLine.split(",");
resultList.add(row);
}
}
catch (IOException ex) {
throw new RuntimeException("Error in reading CSV file: "+ex);
}
finally {
try {
inputStream.close();
}
catch (IOException e) {
throw new RuntimeException("Error while closing input stream: "+e);
}
}
return resultList;
}
}
それでは、「raw」フォルダからCSVファイルをロードし、上記のユーティリティを使用してそれを読み取る方法を教えてください。
InputStream inputStream = getResources().openRawResource(R.raw.stats);
CSVFile csvFile = new CSVFile(inputStream);
List scoreList = csvFile.read();
MainActivity.Java
public class MainActivity extends Activity {
private ListView listView;
private ItemArrayAdapter itemArrayAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
itemArrayAdapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_layout);
Parcelable state = listView.onSaveInstanceState();
listView.setAdapter(itemArrayAdapter);
listView.onRestoreInstanceState(state);
InputStream inputStream = getResources().openRawResource(R.raw.stats);
CSVFile csvFile = new CSVFile(inputStream);
List scoreList = csvFile.read();
for(String[] scoreData:scoreList ) {
itemArrayAdapter.add(scoreData);
}
}
}
ItemArrayAdapter.Java
public class ItemArrayAdapter extends ArrayAdapter {
private List scoreList = new ArrayList();
static class ItemViewHolder {
TextView name;
TextView score;
}
public ItemArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public void add(String[] object) {
scoreList.add(object);
super.add(object);
}
@Override
public int getCount() {
return this.scoreList.size();
}
@Override
public String[] getItem(int index) {
return this.scoreList.get(index);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ItemViewHolder viewHolder;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.item_layout, parent, false);
viewHolder = new ItemViewHolder();
viewHolder.name = (TextView) row.findViewById(R.id.name);
viewHolder.score = (TextView) row.findViewById(R.id.score);
row.setTag(viewHolder);
} else {
viewHolder = (ItemViewHolder)row.getTag();
}
String[] stat = getItem(position);
viewHolder.name.setText(stat[0]);
viewHolder.score.setText(stat[1]);
return row;
}
}
activity_mail.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.javapapers.Android.csvfileread.app.MainActivity">
<ListView
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/listView"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="10dp" />
</RelativeLayout>
item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/name"
Android:layout_alignParentTop="true"
Android:layout_alignParentLeft="true"
Android:layout_marginLeft="20dp" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/score"
Android:layout_alignParentTop="true"
Android:layout_alignParentRight="true"
Android:layout_marginRight="20dp" />
</RelativeLayout>
ソースコード全体については、これらのリンクを参照できます javapapers.com/wp-content/uploads/2014/07/CSVFileRead.Zip
それは役立つと思います
免責事項:私はAndroidで作業したことがありませんが、Javaは知っているので、うまくいけばすべて同じです。
そうは言っても、このようなことを試すことができます。
Scanner scanner = new Scanner(new File("file.csv"));
ArrayList<String> pokemon = new ArrayList<>();
while(scanner.hasNextLine()) {
pokemon.add(scanner.nextLine().split(",")[1]);
}
scanner.close();
デフォルトでは、Androidはrawフォルダーを作成しません。プロジェクトのres/rawの下にrawフォルダーを作成します。その中にCSVファイルをコピーします。 CSVファイルの名前は小文字のままにし、要求されたときにテキスト形式に変換します。私のCSVファイル名はwelldata.scv WellDataです-これはゲッターとセッターを備えたモデルクラスです。 wellDataListは、データを格納するためのArrayListです。
private void readData() {
InputStream is = getResources().openRawResource(R.raw.welldata);
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8")));
String line = "";
try {
while ((line = reader.readLine()) != null) {
//set splitter
String[] tokens = line.split(",");
//read the data
WellData wellData = new WellData();
wellData.setOwner(tokens[0]);
wellData.setApi(tokens[1]);
wellData.setLongitude(tokens[2]);
wellData.setLatitude(tokens[3]);
wellData.setProperty(tokens[4]);
wellData.setWellName(tokens[5]);
wellDataList.add(wellData);
Log.d("MainActivity" ,"Just Created " +wellData);
}
} catch (IOException e1) {
Log.e("MainActivity", "Error" + line, e1);
e1.printStackTrace();
}
}}
引用符で囲まれたフィールドを処理するより優れたCSVパーサー
import Android.content.Context;
import Android.widget.Toast;
import Java.io.BufferedReader;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.InputStream;
import Java.io.InputStreamReader;
import Java.util.ArrayList;
import Java.util.List;
public class CSVReader {
private class StringDArray {
private String[] data=new String[0];
private int used=0;
public void add(String str) {
if (used >= data.length){
int new_size= used+1;
String[] new_data=new String[new_size];
Java.lang.System.arraycopy( data,0,new_data,0,used);
data=new_data;
}
data[used++] = str;
}
public int length(){
return used;
}
public String[] get_araay(){
return data;
}
}
private Context context;
public CSVReader(Context context){
this.context=context;
}
public List read(File file){
List resultList = new ArrayList();
try{
InputStream inputStream= new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String csvLine;
final char Separator = ',';
final char Delimiter = '"';
final char LF = '\n';
final char CR = '\r';
boolean quote_open = false;
while ((csvLine = reader.readLine()) != null) {
//String[] row = csvLine.split(",");// simple way
StringDArray a=new StringDArray();
String token="";
csvLine+=Separator;
for(char c:csvLine.toCharArray()){
switch (c){
case LF: case CR:// not required as we are already read line
quote_open=false;
a.add(token);
token="";
break;
case Delimiter:
quote_open=!quote_open;
break;
case Separator:
if(quote_open==false){
a.add(token);
token="";
}else{
token+=c;
}
break;
default:
token+=c;
break;
}
}
if(a.length()>0 ) {
if(resultList.size()>0){
String[] header_row =(String[]) resultList.get(0);
if(a.length()>=header_row.length) {
String[] row = a.get_araay();
resultList.add(row);
}
}else{
String[] row = a.get_araay();
resultList.add(row);//header row
}
}
}
inputStream.close();
}catch (Exception e){
Toast.makeText(context,"Error : " + e.getMessage(), Toast.LENGTH_LONG).show();
}
return resultList;
}
}
使用方法
File file=new File(path);
CSVReader csvReader=new CSVReader(activity.this);
List csv=csvReader.read(file);
if(csv.size()>0){
String[] header_row =(String[]) csv.get(0);
if(header_row.length>1){
String col1=header_row[0];
String col2=header_row[1];
}
}
Toast.makeText(activity.this,csv.size() + " rows", Toast.LENGTH_LONG).show();
使用したサンプルデータ
ID、名前
1、テスト項目1
"2"、 "テスト項目2"
"3"、 "テスト、アイテム3"
4、テスト項目4
Sharmaの回答を拡張して、CSVファイルのさまざまな条件でコアクラスをより柔軟にしました。私は、CSVファイルの読み取り方法を構成するためのビルダー設計パターンを好みます。
public class CSVFile {
private static final Charset UTF8 = Charset.forName("UTF-8");
private final static String DEFAULT_DELIMITER = ",";
private InputStream inputStream;
private Charset charset;
private String delimiter;
private boolean ignoreHead;
public CSVFile(InputStream inputStream) {
this.inputStream = inputStream;
this.charset = UTF8;
this.delimiter = DEFAULT_DELIMITER;
this.ignoreHead = false;
}
public CSVFile setCharset(Charset charset) {
this.charset = charset;
return this;
}
public CSVFile setDelimiter(String delimiter) {
this.delimiter = delimiter;
return this;
}
public CSVFile ignoreHead() {
ignoreHead = true;
return this;
}
public List<String[]> read() {
boolean firstRow = true;
List<String[]> resultList = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
try {
String csvLine;
while ((csvLine = reader.readLine()) != null) {
if (firstRow) {
firstRow = false;
if (ignoreHead) {
continue;
}
}
String[] row = csvLine.split(delimiter);
resultList.add(row);
}
} catch (IOException ex) {
throw new RuntimeException("Error in reading CSV file: " + ex);
} finally {
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException("Error while closing input stream: " + e);
}
}
return resultList;
}
}