2011-05-15 87 views
1

我有以下樣本CSV文件Java的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中有一種簡單的方法嗎?

+0

如果這是功課告訴我們,請 – Heisenbug 2011-05-15 00:55:57

+0

這個問題是相當廣泛的。請一次一步。在滿足功能要求的同時,你到底在哪一步?讀文件? – BalusC 2011-05-15 01:10:08

+0

這不是作業。我可以使用OpenCSV來讀取CSV文件。我堅持如何用新值更新每列(在運行時乘以或減去每列)。 – user751637 2011-05-15 01:16:54

回答

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); 
    ?> 
+0

是的,我知道fgetcsv函數。但它不符合我的要求(問題)。您能否請提供示例源代碼來說明如何執行此類任務? – user751637 2011-05-15 00:48:58

+0

你的例子減去每一行,而不是列。 – user751637 2011-05-15 01:15:11

+0

是的,它是從第1列減去1,從第2列減去2,所以對每一行都是如此。 – Pradeep 2011-05-15 01:51:34

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類來存儲值。

+0

這是什麼樣的縮進樣式?或者是這個盲目的谷歌Google?無論如何,這並沒有真正回答這個問題。 – BalusC 2011-05-15 01:08:36

+0

@Balusc:這兒遲到了。只是一個快速的建議,以便從文件中讀取字符串並將其拆分。 – Heisenbug 2011-05-15 01:26:20

+0

然後「減少獲取的列的某些值」不能爲字符串值完成,就像用戶的例子..所以很難給他一個完整的答案。 – Heisenbug 2011-05-15 01:28:20

0

就我所知,至少在標準的Java API中,沒有這麼簡單的方法。循環可能是這裏唯一的選擇。

然而,還有其他語言使得這種事情比較簡單。 R(免費和開放源代碼)是數據處理的偉大語言。

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的答案,但我希望這可以幫助你。

0

可以使用JEzCSV用於讀取或寫入CSV文件,你可以可以讀取的代碼,是開源