我有以下樣本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中有一種簡單的方法嗎?
我有以下樣本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中有一種簡單的方法嗎?
它是在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);
?>
是的,我知道fgetcsv函數。但它不符合我的要求(問題)。您能否請提供示例源代碼來說明如何執行此類任務? – user751637 2011-05-15 00:48:58
你的例子減去每一行,而不是列。 – user751637 2011-05-15 01:15:11
是的,它是從第1列減去1,從第2列減去2,所以對每一行都是如此。 – Pradeep 2011-05-15 01:51:34
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類來存儲值。
就我所知,至少在標準的Java API中,沒有這麼簡單的方法。循環可能是這裏唯一的選擇。
然而,還有其他語言使得這種事情比較簡單。 R(免費和開放源代碼)是數據處理的偉大語言。
在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的答案,但我希望這可以幫助你。
可以使用JEzCSV用於讀取或寫入CSV文件,你可以可以讀取的代碼,是開源
如果這是功課告訴我們,請 – Heisenbug 2011-05-15 00:55:57
這個問題是相當廣泛的。請一次一步。在滿足功能要求的同時,你到底在哪一步?讀文件? – BalusC 2011-05-15 01:10:08
這不是作業。我可以使用OpenCSV來讀取CSV文件。我堅持如何用新值更新每列(在運行時乘以或減去每列)。 – user751637 2011-05-15 01:16:54