仅获取Java中CSV的前两个位置

时间:2019-01-04 10:07:15

标签: java csv

我有一个包含德国汽车牌照的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...

5 个答案:

答案 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

关于您的特定问题,其他答案是正确的。另外,下面是使用Apache Commons CSV库的示例代码,使此工作更加容易。

请注意我们如何检索3个字段中的每个字段,但仅使用前2个,而忽略第三个(根据您的问题)。

Screenshot of the tabular data in the CityLetter.csv file, three columns and three rows for Berlin, Paris, and Tunis.

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始终采用这种格式时,才执行此操作。

通过这种方法,如果需要,您可以轻松地将行转换为类实例。