有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

解析Java 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) 个答案

  1. # 1 楼答案

    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. # 2 楼答案

    你可以用JEzCSV读或写CSV文件,你可以读代码,是开源的

  3. # 3 楼答案

    在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. # 4 楼答案

    在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 );
        ?>
    
  5. # 5 楼答案

    据我所知,没有“简单”的方法可以做到这一点,至少在标准JavaAPI中是这样。循环可能是这里唯一的选择

    然而,还有其他语言使这类事情相对简单。R(免费提供且开源)是一种用于数据操作的优秀语言

  6. # 6 楼答案

    您可能对我发布到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);
    };
    

    }