我有以下示例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 :(得分: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);
};
}