/*******************************************************************************
* Copyright 2016 Observational Health Data Sciences and Informatics
*
* This file is part of WhiteRabbit
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.ohdsi.utilities.files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ohdsi.utilities.StringUtilities;
public class Row {
private List<String> cells;
private Map<String, Integer> fieldName2ColumnIndex;
public Row() {
fieldName2ColumnIndex = new HashMap<String, Integer>();
cells = new ArrayList<String>();
}
public Row(List<String> cells, Map<String, Integer> fieldName2ColumnIndex) {
this.cells = cells;
this.fieldName2ColumnIndex = fieldName2ColumnIndex;
}
public Row(Row row) {
cells = new ArrayList<String>(row.cells);
fieldName2ColumnIndex = new HashMap<String, Integer>(row.fieldName2ColumnIndex);
}
public String get(String fieldName) {
int index;
try {
index = fieldName2ColumnIndex.get(fieldName);
} catch (NullPointerException e) {
throw new RuntimeException("Field \"" + fieldName + "\" not found");
}
if (cells.size() <= index)
return null;
else
return cells.get(index);
}
public List<String> getFieldNames() {
List<String> names = new ArrayList<String>(fieldName2ColumnIndex.size());
for (int i = 0; i < fieldName2ColumnIndex.size(); i++)
names.add(null);
for (Map.Entry<String, Integer> entry : fieldName2ColumnIndex.entrySet())
names.set(entry.getValue(), entry.getKey());
return names;
}
public int getInt(String fieldName) {
return Integer.parseInt(get(fieldName).trim());
}
public long getLong(String fieldName) {
return Long.parseLong(get(fieldName));
}
public double getDouble(String fieldName) {
return Double.parseDouble(get(fieldName));
}
public void add(String fieldName, String value) {
fieldName2ColumnIndex.put(fieldName, cells.size());
cells.add(value);
}
public void add(String fieldName, int value) {
add(fieldName, Integer.toString(value));
}
public void add(String fieldName, boolean value) {
add(fieldName, Boolean.toString(value));
}
public void add(String fieldName, double value) {
add(fieldName, Double.toString(value));
}
public void add(String fieldName, long value) {
add(fieldName, Long.toString(value));
}
public void set(String fieldName, String value) {
cells.set(fieldName2ColumnIndex.get(fieldName), value);
}
public void set(String fieldName, int value) {
set(fieldName, Integer.toString(value));
}
public void set(String fieldName, long value) {
set(fieldName, Long.toString(value));
}
public void set(String fieldName, double value) {
set(fieldName, Double.toString(value));
}
public List<String> getCells() {
return cells;
}
protected Map<String, Integer> getfieldName2ColumnIndex() {
return fieldName2ColumnIndex;
}
public String toString() {
List<String> data = new ArrayList<String>(cells);
for (String fieldName : fieldName2ColumnIndex.keySet()) {
int index = fieldName2ColumnIndex.get(fieldName);
if (data.size() > index)
data.set(index, "[" + fieldName + ": " + data.get(index) + "]");
}
return StringUtilities.join(data, ",");
}
public void remove(String field) {
Integer index = fieldName2ColumnIndex.remove(field);
cells.remove(index);
Map<String, Integer> tempMap = new HashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : fieldName2ColumnIndex.entrySet())
if (entry.getValue() > index)
tempMap.put(entry.getKey(), entry.getValue() - 1);
else
tempMap.put(entry.getKey(), entry.getValue());
}
public void upperCaseFieldNames() {
Map<String, Integer> tempMap = new HashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : fieldName2ColumnIndex.entrySet())
tempMap.put(entry.getKey().toUpperCase(), entry.getValue());
fieldName2ColumnIndex = tempMap;
}
}