If you want to overwrite the existing class for different collection using typescript
then you have to inherit the existing class from different class.
export class User extends Typegoose{
@prop
username?:string
password?:string
}
export class newUser extends User{
constructor() {
super();
}
}
export const UserModel = new User ().getModelForClass(User , { schemaOptions: { collection: "collection1" } });
export const newUserModel = new newUser ().getModelForClass(newUser , { schemaOptions: { collection: "collection2" } });
Прежде всего, я рекомендую вам создать класс Entry
, который представляет ваши данные.
private class Entry {
private String name;
private double length;
private double width;
// getters and setters omitted
@Override
public String toString() {
// omitted
}
}
Затем создайте метод, который принимает String
в качестве аргументов и отвечает за разбор строки текста в экземпляре Entry
. Регулярное выражение \\s+
сопоставляет любые пробельные символы и разделит вашу строку на отдельные столбцы. Помните, что в производстве Double.valueOf
может выдать RuntimeException
, если вы не передаете действительный String
.
Наконец, вы можете прочитать файл, используя API потока Java 8. Пропустите первую строку, поскольку она содержит заголовок столбца, а не фактические данные.
private void readFile() throws Exception {
Path path = Paths.get(/* path to your file */);
Files.readAllLines(path).stream().skip(1).map(FileReadTest::toEntry)
.forEach(this::action);
}
В моем примере я просто печатаю каждую запись на консоли:
private void action(Entry entry) {
System.out.println(entry);
}
Результирующий вывод:
Entry[name='truck1', length=18.6, width=8.1]
Entry[name='suv1', length=17.4, width=7.4]
Entry[name='coupe1', length=14.8, width=5.4]
Entry[name='mini1', length=14.1, width=5.0]
Entry[name='sedan1', length=16.4, width=6.1]
Entry[name='suv2', length=17.5, width=7.3]
Entry[name='mini2', length=14.3, width=5.2]
Entry[name='sedan2', length=16.5, width=6.2]
Вот пример того, как правильно читать текстовый файл - замените кодировку на тот, который вам нужен.
try (final BufferedReader br = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Когда у вас есть отдельные строки, вы можете разделить их на пробелы: str.split("\\s+");
Вы получите массив с тремя записями. Я думаю, вы можете выяснить, остальное.
Сканер и Buffer Reader больше не используются, так как Java предоставляет лучший способ достичь того же результата с меньшим количеством кода. Я вижу по крайней мере три возможных подхода для решения вашей проблемы:
подход 1 : если вы можете использовать хотя бы Java 8, то я бы предложил использовать java.nio .file библиотеки в читают файл как поток строк :
Stream<String> linesStream=Files.lines("cars.txt");
Затем, в зависимости от того, что вам нужно сделать, вы можете использовать либо forEach [115 ], который будет зацикливаться на каждой строке потока:
linesStream.forEach(e -> e.myMethod());
или Java Collectors для выполнения необходимых вычислений. Хороший учебник о коллекционерах можно найти здесь здесь . Вы также можете использовать коллекторы для разделения вашей строки и т. Д ...
подход 2 : вы можете использовать библиотеки Apache Commons для достижения той же цели. В частности, вы можете использовать FileUtils и StringUtils . Например:
File carFile=new File("cars.txt");
LineIterator lineIterator=lineIterator(carFile);
for(String line : lineIterator) {
String[] my values=StringUtils.split(line);
//do whatever you need
}
подход 3 : используйте Джексона, чтобы преобразовать ваш файл в объект json или java, который вы затем сможете использовать для своих собственных преобразований. Здесь приведен пример, объясняющий, как преобразовать CSV в JSON. Немного покопавшись в документации Джексона, вы можете применить ее к своему делу.