De la charge .fichier yml dans hashmaps à l'aide de snakeyaml (import junit bibliothèque)
Je suis en train de charger opencv .fichier yml dans arrayLists dire, de projection et d'étiquettes. J'ai créer ces trois arraylists et je suis en train d'analyser en eux les éléments de la .fichier yml. J'ai trouvé snakeYAML documentation . Cependant, je n'ai pas trouver un moyen de le faire correctement. Je suis en train d'utiliser
final String fileName = "train.yml";
opencvmatrix mat = new opencvmatrix();
Yaml yaml = new Yaml();
try {
InputStream ios = new FileInputStream(new File(fileName));
//Parse the YAML file and return the output as a series of Maps and Lists
Map<String,Object> result = (Map<String,Object>)yaml.load(ios);
System.out.println(result.toString());
Collection<Object> file = result.values();
} catch (Exception e) {
e.printStackTrace();
}
}
Je reçois comme une erreur suivants:
Exception in thread "main" while scanning a directive
in 'reader', line 1, column 1:
%YAML:1.0
^
expected alphabetic or numeric character, but found :(58)
in 'reader', line 1, column 6:
%YAML:1.0
^
at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirectiveName(ScannerImpl.java:1269)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirective(ScannerImpl.java:1221)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDirective(ScannerImpl.java:614)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:306)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:226)
at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:195)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143)
at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:104)
at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:412)
at projectCV.main(projectCV.java:33)
Java Result: 1
EDIT1: j'ai remarqué que mes problèmes se dresse pour assertEquals qui est une fonction de la classe assert partie de junit bibliothèque. Je ne peux pas trouver un moyen d'importer correctement à la bibliothèque de mon classpath. Je suis en train de deux choses, de les télécharger .jar fichier et AJOUTER/dossier Jar et dans les propriétés du projet->bibliothèques->compiler des tests-> add library -> Junit 4.10. Mais je suis toujours avoir des problèmes.
EDIT2: j'ai modifier le fichier YAML 1,0 à YAML 1.1, mais rien ne change. Je suis encore à essayer de trouver une façon de lire le fichier yml.
final String fileName = "train.yml";
opencvmatrix mat = new opencvmatrix();
Yaml yaml = new Yaml();
try {
InputStream ios = new FileInputStream(new File(fileName));
//Parse the YAML file and return the output as a series of Maps and Lists
Map<String,Object> result = (Map<String,Object>)yaml.load(ios);
System.out.println(result.toString());
Collection<Object> file = result.values();
} catch (Exception e) {
e.printStackTrace();
}
}
Lorsque j'essaie d'exécuter ce code j'obtiens:
Exception in thread "main" Can't construct a java object for tag:yaml.org,2002:opencv-
matrix; exception=Class not found: opencv-matrix
in 'reader', line 3, column 7:
mean: !!opencv-matrix
^
EDIT3: j'ai créé une classe opencvmatrix (comme le nom de .yml propriétés), avec les propriétés de lignes, de colonnes, dt, liste de tableaux de données. L' .fichier yml est comme:
num_components: 19
num_components: 19
mean: !!opencvmatrix
rows: 1
cols: 3600
dt: d
data: [ 9.6842105263157890e+01, 1.0257894736842104e+02,
1.0557894736842104e+02, 1.0794736842105263e+02,
1.1752631578947367e+02, 1.1631578947368421e+02,
1.1084210526315789e+02, 1.0373684210526315e+02,
1.0052631578947368e+02, 9.5263157894736835e+01,
9.0421052631578945e+01, 8.5631578947368411e+01,
7.8684210526315780e+01, 7.2105263157894740e+01,
6.9315789473684205e+01, 6.9105263157894740e+01,
7.1052631578947370e+01, 7.9631578947368411e+01,
9.0894736842105260e+01, 1.0121052631578947e+02,
....]
projections:
- !!opencvmatrix
rows: 1
cols: 19
dt: d
data: [ 1.6852352677811423e+03, -1.0112905042030820e+03,
-1.3152188243875064e+03, 4.8298990155435700e+02,
9.1980535900698968e+01, 6.5624763621018792e+02,
-1.2380244625181117e+03, -1.8800931631152707e+02,
-4.1473232893431384e+02, 5.7197035514178856e+02,
4.9990276749703435e+02, 4.9062987890888604e+02,
6.1928710580829818e+02, -1.2842392693864540e+03,
2.4907719466932619e+01, 8.0299588479341844e+02,
1.1621501008120421e+02, 1.0410492864645674e+02,
8.5302163830384785e+01 ]
- !!opencvmatrix
rows: 1
cols: 19
dt: d
data: [ -1.0313663745467784e+03, 1.9900404646205566e+03,
-1.2844533156050284e+02, -4.3700867528097513e+02,
6.6145551346834259e+02, -2.0562483671734990e+03,
-1.9643774942432364e+02, 4.9329679854416281e+02,
-2.0003326324501427e+02, 1.0737995038485865e+03,
5.4161214984553695e+01, 4.7932826490658994e+02,
8.6307152262273064e+02, 6.7413046532276610e+02,
6.3835284527337114e+02, 4.1663169960066972e+02,
3.5883912817427905e+01, -1.2935687563770381e+02,
-1.6471877227400194e+03 ]
...
labels: !!opencvmatrix
rows: 1
cols: 19
dt: i
data: [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 ]
Maintenant sans changer le code principal, je reçois l'erreur suivante:
Can't construct a java object for tag:yaml.org,2002:opencvmatrix; exception=No single
argument constructor found for class opencvmatrix
in 'reader', line 1, column 7:
mean: !!opencvmatrix
^
OriginalL'auteur snake plissken | 2014-01-15
Vous devez vous connecter pour publier un commentaire.
Je suis enfin en essayant le code ci-dessus:
Qui les lit .fichier yml et retourne les clés et les valeurs correspondant du fichier. Mon problème est que la valeur contient d'autres objets qui, à leur tour, contient d'autres Cartes en raison de l'ordre du fichier yaml. Println montre ci-dessus dans le terminal:
Comment puis-je avoir accès à l'retourné objets imbriqués???
Edit2: en Fait, j'ai eu à jeter les objets retournés de la .fichier yaml à une nouvelle catégorie que j'ai à définir. Donc mon code pour la lecture .yml éléments (en face de reconnaissance formé des éléments):
OriginalL'auteur snake plissken
SnakeYaml est YAML 1.1 analyseur et que vous tentez d'analyser YAML 1.0.
Il est indiqué par "%YAML:1.0" directive (voir 3.2.3.3 dans les specs http://yaml.org/spec/1.0/#id2558635 )
YAML 1.1 a une syntaxe différente - "%YAML 1.1" (voir 7.1.1 dans les specs http://yaml.org/spec/1.1/#id895631 )
Vous pouvez essayer d'enlever cette directive à partir de votre fichier ou de le changer pour "%YAML 1.1" et j'espère qu'il sera analysée correctement.
"%YAML 1.1" et non "%YAML:1.1". Basé sur votre 2ème edition sont mauvais. Exception ont changé. Il a enfin commencé à l'analyse de votre fichier yaml. Maintenant vous avez une erreur différente. Comme il le dit "Classe non trouvé: opencv-matrice" SnakeYaml tente de créer un objet de type opencv-matrice, déclenchée par !!opencv-matrice de la balise.
J'ai donc cinq à analyser chaque élément de .fichier yml dans les séparer des objets??
En fait par défaut la première ligne est %YAML:1.0. Classe pas trouvé exception survient lorsque je tottaly de supprimer la première ligne du fichier.
OriginalL'auteur maslovalex