La dernière fois, j'ai écrit Process and output CSV file. Je souhaite traiter le fichier CSV lorsqu'il arrive dans le répertoire cible. J'ai pensé, alors je vais écrire le code.
test.java
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;
public class test {
public static void main(String[] args) throws Exception {
Path dir = Paths.get("C://develop//BOX");
WatchService watcher = FileSystems.getDefault().newWatchService();
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
for (;;) {
WatchKey watchKey = watcher.take();
for (WatchEvent<?> event: watchKey.pollEvents()) {
if (event.kind() == OVERFLOW) continue;
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);
System.out.format("%s: %s\n", event.kind().name(), child);
}
watchKey.reset();
}
}
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
}
Maintenant, créez un répertoire appelé ** BOX ** dans ** C: \ develop **,
Essayez de compiler test.java n'importe où et d'exécuter la classe. (* Cette fois, je cours avec D: )
Hou la la! Si vous obtenez une erreur lors de la compilation: débutant: ** ici ** Ce sera utile.
Maintenant, exécutez le fichier de classe. Essayez de mettre un fichier approprié dans le répertoire BOX.
Oups! L'exemple .txt que j'ai mis dans le répertoire Il dit ENTRY_CREATE et ENTRY_MODIFY.
Lorsque je supprime le fichier du répertoire, je vois ENTRY_DELETE.
Je pense que vous pouvez le comprendre après l'avoir déplacé, alors j'ai collé l'image lorsque je l'ai déplacée en premier Ceci est écrit dans test.java. (Le commentaire est écrit dans mon interprétation, donc j'ai peut-être fait une erreur ...) La deuxième ligne ** WatchService watcher = FileSystems.getDefault (). NewWatchService (); ** Cela semble être une phrase fixe, je vais donc l'utiliser telle quelle sans réfléchir profondément.
Path dir = Paths.get("C://develop//BOX"); //"dir"Spécifiez le répertoire à surveiller dans
WatchService watcher = FileSystems.getDefault().newWatchService(); //Service de montre"watcher"Créé avec le nom
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); //"dir"Spécifiez l'événement à surveiller dans(Créer,Effacer,Changement)
for (;;) { //Implémenter une boucle infinie pour attendre un événement
WatchKey watchKey = watcher.take(); //Clé de l'observateur de l'observateur"watchKey"Obtenir
for (WatchEvent<?> event: watchKey.pollEvents()) { //Vous pouvez obtenir la liste qui stocke WatchEvent avec la méthode pollEvents.
if (event.kind() == OVERFLOW) continue; //"OVERFLOW"Est un événement de surveillance spécial qui indique que l'événement a disparu ou a été détruit
WatchEvent<Path> ev = cast(event);
Path name = ev.context(); //"name"Entrez dans le contexte de l'événement et définissez le nom du fichier
Path child = dir.resolve(name); //Chemin complet avec méthode de résolution("dir"Sur le chemin de"name"Ajoutée)L'ensemble
System.out.format("%s: %s\n", event.kind().name(), child); //Au moment de la sortie, [nom de l'événement:Instructions de sortie avec [Chemin complet du fichier]
}
watchKey.reset(); //Réinitialiser la clé de la montre(Pour remettre l'état WatchKey à READY)
test.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test{
public static void main(String[] args) {
process("20180712.csv", ":00,","output.csv");
}
public static void process(String read_file, String searchString, String output_file){
try(FileReader fr = new FileReader(read_file);BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(output_file);BufferedWriter bw = new BufferedWriter(fw)){
String line;
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile(searchString);
Matcher m = p.matcher(line);
if (m.find()){
String[] csvArray;
csvArray = line.split(",");
String time = csvArray[0];
float press = Float.parseFloat(csvArray[1])%10000;
String pressure = String.format("%.2f", press);
String temperature = csvArray[2];
String outputLine = String.join(",",time,pressure,temperature);
bw.write(outputLine);
bw.newLine();
}else{
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Le code que j'ai écrit ci-dessus n'a pas beaucoup changé par rapport au code précédent. C'est presque juste combiné.
test.java
import java.nio.file.FileSystems; //Requis pour la surveillance des répertoires
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.Watchable;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.WatchEvent.*;
import java.io.BufferedReader; //Requis pour traiter et sortir le csv
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class test {
public static void main(String[] args) throws Exception {
Path dir = Paths.get(System.getenv("CSV_DIR")); //Cette fois, le répertoire à surveiller est une variable d'environnement."CSV_DIR"Mis à
WatchService watcher = FileSystems.getDefault().newWatchService();
dir.register(watcher, ENTRY_CREATE); //Cette fois ENTRÉE_OK si seul CREATE est détecté
for (;;) {
WatchKey watchKey = watcher.take();
for (WatchEvent<?> event: watchKey.pollEvents()) {
if (event.kind() == OVERFLOW) continue;
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);
String newfile =String.format("%s", child);
process(newfile, ":00,","D://tedkuma//★"+name); //Passez le chemin complet du fichier détecté au fichier lu par le processus
System.out.println("Output success:"+name);
}
watchKey.reset();
}
}
@SuppressWarnings("unchecked")
static <T> WatchEvent<T> cast(WatchEvent<?> event) {
return (WatchEvent<T>)event;
}
public static void process(String read_file, String searchString, String output_file){ //Ce qui suit est le même que le précédent
try(FileReader fr = new FileReader(read_file);BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(output_file);BufferedWriter bw = new BufferedWriter(fw)){
String line;
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile(searchString);
Matcher m = p.matcher(line);
if (m.find()){
String[] csvArray;
csvArray = line.split(",");
String time = csvArray[0];
float press = Float.parseFloat(csvArray[1])%10000;
String pressure = String.format("%.2f", press);
String temperature = csvArray[2];
String outputLine = String.join(",",time,pressure,temperature);
bw.write(outputLine);
bw.newLine();
}else{
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Puisque les commentaires japonais et les marques ★ sont inclus dans le fichier java javac seul entraînera une erreur de compilation: sueur: : crâne: Erreur: Ce caractère ne peut pas être mappé au codage MS932, il apparaîtra donc. Cette fois, je compile avec ** javac -encodhing utf-8 test.java **. Lançons-le.
J'ai défini la variable d'environnement "CSV_DIR" à l'emplacement C: \ develop \ monitor. (Ce répertoire surveillé) Placez-y le fichier CSV que vous souhaitez traiter.
Le nom du fichier que vous avez placé dans le répertoire s'affiche après le succès de la sortie:.
Vérifiez le répertoire tedkuma du lecteur D spécifié comme destination de sortie. Un fichier avec une étoile au début du nom de fichier est sorti, et le csv à l'intérieur est également traité.
Cette fois, c'est fini.
Recommended Posts