仅从 CSV 文件导入特定列
Importing only specific columns from CSV file
我正在尝试使用 Java 库 openCSV 导入 CSV 文件。有没有办法只加载特定列而不是全部?我现在的代码是:
JFileChooser fileopen = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter(
"CSV file", "csv");
fileopen.addChoosableFileFilter(filter);
int ret = fileopen.showDialog(null, "Choose file");
if (ret == JFileChooser.APPROVE_OPTION) {
try {
File file = fileopen.getSelectedFile();
System.out.println("Opening: " + file.getName());
File csvFilename = fileopen.getSelectedFile();
try (CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ',', '\'',11 )) {
String[] row = null;
while((row = csvReader.readNext()) != null) {
System.out.println(row[0]
+ " # " + row[1]
+ " # " + row[2]);
}
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Glass_search.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Glass_search.class.getName()).log(Level.SEVERE, null, ex);
}
}
这个文件也有标题,所以也许是这样?
如果您使用 CSVReaderBuilder 创建 CSVReader 实例,您可以设置自己的解析器供 reader 使用。然后您需要做的就是创建您自己的实现 ICSVParser 接口的解析器。
对于这种特殊情况,univocity-parsers 更合适,因为您可以轻松选择要获取的列:
CsvParserSettings parserSettings = new CsvParserSettings();
settings.detectFormatAutomatically(); //detects the format
//extracts the headers from the input
settings.setHeaderExtractionEnabled(true);
//or give the header names yourself
// if you use this it will override the headers read from the input (enabled above).
settings.setHeaders("A", "B", "C");
//now for the column selection
settings.selectFields("A", "C"); //rows will contain only values of column "A" and "C"
//or
settings.selectIndexes(0, 2); //rows will contain only values of columns at position 0 and 2
List<String[]> rows = new CsvParser(settings).parseAll(new File("/path/to/your.csv"), "UTF-8");
您还可以获取 List
中每一列的值:
ColumnProcessor columnProcessor = new ColumnProcessor();
settings.setProcessor(columnProcessor);
CsvParser parser = new CsvParser(settings);
parser.parse(new File("/path/to/your.csv), "UTF-8"); //all rows are submitted to the processor created above.
Map<String, List<String>> columnValues = columnProcessor.getColumnValuesAsMapOfNames();
这应该可以解决您所有的问题,希望对您有所帮助。
免责声明:我是这个图书馆的作者。它 open-source 并且免费(Apache 2.0 许可证)
我正在尝试使用 Java 库 openCSV 导入 CSV 文件。有没有办法只加载特定列而不是全部?我现在的代码是:
JFileChooser fileopen = new JFileChooser();
FileFilter filter = new FileNameExtensionFilter(
"CSV file", "csv");
fileopen.addChoosableFileFilter(filter);
int ret = fileopen.showDialog(null, "Choose file");
if (ret == JFileChooser.APPROVE_OPTION) {
try {
File file = fileopen.getSelectedFile();
System.out.println("Opening: " + file.getName());
File csvFilename = fileopen.getSelectedFile();
try (CSVReader csvReader = new CSVReader(new FileReader(csvFilename), ',', '\'',11 )) {
String[] row = null;
while((row = csvReader.readNext()) != null) {
System.out.println(row[0]
+ " # " + row[1]
+ " # " + row[2]);
}
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Glass_search.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Glass_search.class.getName()).log(Level.SEVERE, null, ex);
}
}
这个文件也有标题,所以也许是这样?
如果您使用 CSVReaderBuilder 创建 CSVReader 实例,您可以设置自己的解析器供 reader 使用。然后您需要做的就是创建您自己的实现 ICSVParser 接口的解析器。
对于这种特殊情况,univocity-parsers 更合适,因为您可以轻松选择要获取的列:
CsvParserSettings parserSettings = new CsvParserSettings();
settings.detectFormatAutomatically(); //detects the format
//extracts the headers from the input
settings.setHeaderExtractionEnabled(true);
//or give the header names yourself
// if you use this it will override the headers read from the input (enabled above).
settings.setHeaders("A", "B", "C");
//now for the column selection
settings.selectFields("A", "C"); //rows will contain only values of column "A" and "C"
//or
settings.selectIndexes(0, 2); //rows will contain only values of columns at position 0 and 2
List<String[]> rows = new CsvParser(settings).parseAll(new File("/path/to/your.csv"), "UTF-8");
您还可以获取 List
中每一列的值:
ColumnProcessor columnProcessor = new ColumnProcessor();
settings.setProcessor(columnProcessor);
CsvParser parser = new CsvParser(settings);
parser.parse(new File("/path/to/your.csv), "UTF-8"); //all rows are submitted to the processor created above.
Map<String, List<String>> columnValues = columnProcessor.getColumnValuesAsMapOfNames();
这应该可以解决您所有的问题,希望对您有所帮助。
免责声明:我是这个图书馆的作者。它 open-source 并且免费(Apache 2.0 许可证)