Java CSV文件操作

时间:2011-05-15 00:42:16

标签: java parsing csv

我有以下示例CSV文件

rc,u,s,ui,gh
m,1,8,0,12
n,3,0,0,7
d,1,1,8,0

我想阅读此CSV文件并按名称获取列(例如,s)。按某些值减去提取的列,并更新CSV文件中的该列。

在Java中有一种简单的方法吗?

6 个答案:

答案 0 :(得分:0)

在PHP中很容易,你可以使用fgetcsv函数http://php.net/manual/en/function.fgetcsv.php

添加了样本

    <?php

    $inHandle= fopen("input.csv", "r");

    $text = "";
    $someVar = array(1, 2, 3, 4);           // for subtracting 1 from col1 2 from col2 ...

    while ( ( $data = fgetcsv($inHandle) ) !== FALSE) 
    {
    $text  = $text  . $data[0];

    for ($i= 1; $i < count($data);  $i++) 
    {

        if($i==0)
            $text =  $text .  $data[$i] . ", ";
        else
            $text =  $text .  ( $data[$i] - $someVar[$i -1] ) . " , ";
    }
       $text =  $text . " \n";
    }

    fclose($inHandle);

    $outHandle = fopen('output.csv', 'w');

    fwrite($outHandle , $text );

    fclose($outHandle );
    ?>

答案 1 :(得分:0)

String line;
BufferedReader br = new BufferedReader(new FileReader("path_to_your_file"));

while ((line = br.readLine()) != null) { 
       StringTokenizer tokenizer = new StringTokenizer(line, ",");

       while(tokenizer.hasMoreTokens()) {
              String token = tokenizer.nextToken(); 
       } 
}

通过这种方式,您可以将逗号分隔为令牌。用它们做你想做的事,然后看看BufferedWriter类来存储值。

答案 2 :(得分:0)

据我所知,至少使用标准Java API,没有“简单”的方法。循环可能是这里唯一的选择。

然而,还有其他语言使这种事情变得相对简单。 R(免费提供和开源)是一种很好的数据操作语言。

答案 3 :(得分:0)

在PHP中你可以试试这样的东西:

<?php
function csv2PhpArray($sFile,$sSeparator = ';'){
$arrCsv;
$arrCsvKeys;
$i = 0;
    if (($handle = fopen($sFile, "r")) !== false) {
        while (($arrRow = fgetcsv($handle, 1000, $sSeparator)) !== false) {
            //Each row
            $nLenRow = count($arrRow);
            for ($j=0; $j < $nLenRow; $j++) {
                if($i==0){
                    $arrCsvKeys[] = $arrRow[$j];
                }else{
                    $arrCsv[$arrCsvKeys[$j]][] = $arrRow[$j];
                }
            }
            if($i==0) $i++;
        }
        fclose($handle);
    }
    return $arrCsv;
}
function updateCsv($arrCsv,$sFile,$sSeparator = ';'){
    $arrCsvKeys = array_keys($arrCsv);
    $i = 0;
    $nMaxKeys = count($arrCsvKeys);
    $nMax  = count($arrCsv[$arrCsvKeys['0']]);
    $arrInput;
    for($k=0;$k<$nMaxKeys;$k++){
        $arrInput[$i][$k] = $arrCsvKeys[$k];
    }
    for($j=0;$j<$nMax;$j++){
        $i++;
        for($k=0;$k<$nMaxKeys;$k++){
            $arrInput[$i][$k] = $arrCsv[$arrCsvKeys[$k]][$j];
        }
    }

    $nMax  = count($arrInput);
    $fp = fopen($sFile, 'w');
    for($i=0;$i<$nMax;$i++){
        fputcsv($fp, $arrInput[$i]);
    }

    fclose($fp);
}

$arrCsv = csv2PhpArray('file.csv',';');
echo '<pre>';
var_dump($arrCsv);
echo '</pre>';
$nMax = count($arrCsv['s']);
for($i=0;$i<$nMax;$i++){
    $arrCsv['s'][$i]= intval($arrCsv['s'][$i])+10;
}
echo '<pre>';
var_dump($arrCsv);
echo '</pre>';
updateCsv($arrCsv,'file2.csv',';');
echo '<pre>';
var_dump(csv2PhpArray('file2.csv',';'));
echo '</pre>';
?>

我放了两个文件(file.csv和file2.csv)来查看更新结果。

我看到你只将答案改为java,但我希望这可以帮助你。

答案 4 :(得分:0)

您可以使用JEzCSV来读取或写入CSV文件,是否可以阅读代码,是开源的

答案 5 :(得分:0)

您可能对我发布到GitHub的代码感兴趣,该代码读取CSV,将CSV放入POJO,然后从POJO写入CSV文件。这将使用POJO修改原始CSV,并将所需的新列写入新的CSV文件。

https://github.com/Blue4570/CsvAppender

公共类CsvWriter {

private File csvFile;
private String delimiter;
static final String NEW_FILE_LOCATION_AND_NAME = "<LOCATION_AND_NAME_OF_YOUR_FILE_HERE";


public CsvWriter(String delimiter) {
    this.csvFile = new File(getClass().getClassLoader().getResource("csv/TestCsv.txt").getFile());
    this.delimiter = delimiter;
}

public void writeFile() {
    List<NewTable> tableList = readFile(csvFile);
    try(FileWriter writer = new FileWriter(NEW_FILE_LOCATION_AND_NAME)) {
        writer.append("ID$FirstName$LastName").append("\n");
        tableList.forEach(table -> {
            try {
                writer.append(table.getId()).append(delimiter);
                writer.append(table.getFirstName()).append(delimiter);
                writer.append(table.getLastName());
                writer.append("\n");
            } catch (IOException e) {
                System.out.println("Unable to write new File");
                e.printStackTrace();
            }
        });
    } catch(IOException e) {
        System.out.println("Unable to write new file");
    }
}

private List<NewTable> readFile(File csvFile) {
    List<NewTable> tableList = new ArrayList<>();
    try (InputStream inputFS = new FileInputStream(csvFile);
         BufferedReader br = new BufferedReader(new InputStreamReader(inputFS))
    ) {
        // skip the header of the csv
        tableList = br.lines().skip(1).map(mapToItem).collect(Collectors.toList());

    } catch (IOException e) {
        System.out.println("Error reading file");
    }
    return tableList;
}

private Function<String, NewTable> mapToItem = (line) -> {
    Optional<NewTable> newTable = Optional.empty();
    if (line != null) {
        String[] p = line.split("\\$");
         newTable = Optional.of(new NewTable(p[0], p[1]));
    }
    return newTable.orElseGet(NewTable::new);
};

}