我有一个包含德国汽车牌照的csv文件。结构如下: B,柏林,德国 第一个B是城市的第一个大写字母,第二个位置是城市,第三个位置是州
我只想要前两个职位,只有B和柏林
我知道如何用Java读取CSV文件,但是我不知道如何告诉编译器“忽略”第三个位置?
public void read(){
InputStream inputStream = getResources().openRawResource(R.raw.carplates);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String csvLine;
while ((csvLine = reader.readLine()) != null) {
String[] row = csvLine.split(",");
for(int i=0; i<row.length;i++){
Log.d("ROWS", row[i]);
}
}
输出是一个包含B,柏林和德国的数组。由于有400个印版,因此无法手动删除csv文件中的状态。 这有什么窍门?
提前谢谢
[清除]
所有元素都在同一行:B,Berlin,Germany,M,Munich,Germany...
答案 0 :(得分:3)
跳过打印的最后一行:
for(int i=0; i<row.length - 1; i++){
Log.d("ROWS", row[i]);
}
如果确定每行恰好包含3个值,请执行此操作。理想情况下,这些东西应该是可配置的。通常,您不希望只记录内容,因此可以考虑将数据映射到一些License.class并使用license.getLetter(),license.getCity()或其他任何方式
答案 1 :(得分:1)
您可以更新循环条件以仅读取列表的前两个元素。
类似
public void read(){
InputStream inputStream = getResources().openRawResource(R.raw.kfzkennzeichen);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String csvLine;
while ((csvLine = reader.readLine()) != null) {
String[] row = csvLine.split(",");
if (row.lenght >= 2){
for(int i=0; i<2;i++){
Log.d("ROWS", row[i]);
}
}else{
Log.d("Invalid Row");
}
}
希望这会有所帮助。
答案 2 :(得分:1)
//ideally, this should be on config file
int maxIndexToRead = 2;
for(int i=0; i< maxIndexToRead;i++)
{
Log.d("ROWS", row[i]);
}
是的,Allman风格规则; )
答案 3 :(得分:1)
关于您的特定问题,其他答案是正确的。另外,下面是使用Apache Commons CSV库的示例代码,使此工作更加容易。
请注意我们如何检索3个字段中的每个字段,但仅使用前2个,而忽略第三个(根据您的问题)。
package com.basilbourque.example;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CityLetter {
public static void main ( String[] args ) {
CityLetter app = new CityLetter();
app.doit();
}
private void doit ( ) {
try {
// Locate file to import and parse.
Path path = Paths.get( "/Users/basilbourque/CityLetter.csv" );
if ( Files.notExists( path ) ) { System.out.println( "ERROR - no file found for path: " + path + ". Message # f31b73b0-7ba7-4ea8-81b4-c8d768dde99d." ); }
// Read CSV file.
// For each row, use 2 of the 3 fields (letter, city), while ignoring the third (country).
BufferedReader reader = Files.newBufferedReader( path );
Iterable < CSVRecord > records = CSVFormat.RFC4180.parse( reader );
for ( CSVRecord record : records ) {
// B,Berlin,Germany
// P,Paris,France
// T,Tunis,Tunisia
String letter = record.get( 1 - 1 ); // Annoying zero-based index counting.
String city = record.get( 2 - 1 );
String country = record.get( 3 - 1 ); // Ignore.
// Use the 2 of 3 values.
System.out.println( "letter: " + letter + " | City: " + city );
// City city = new City( letter , city );
// listOfCities.add( city );
}
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
运行时。
字母:B |城市:柏林
字母:P |城市:巴黎
字母:T |城市:突尼斯
或者,您可以按名称而不是索引号来引用每一列。添加标题行,然后在CSVFormat.RFC4180
上添加另一个调用以查找那些标题。
请参见my Answer上的示例代码,以了解类似的问题。
答案 4 :(得分:0)
如果需要,您可以消除for循环:
public void read() {
InputStream inputStream = getResources().openRawResource(R.raw.carplates);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String csvLine;
while((csvLine = reader.readLine()) != null) {
String[] row = csvLine.split(",");
Log.d("First capital letter of the city: ", row[0]);
Log.d("City: ", row[1]);
}
} catch(...) {
//...
}
}
但是,正如@Akceptor在另一个答案中提到的那样,仅当您确定CSV始终采用这种格式时,才执行此操作。
通过这种方法,如果需要,您可以轻松地将行转换为类实例。