Letztes Mal habe ich [CSV-Datei verarbeiten und ausgeben] geschrieben (https://qiita.com/tedkuma/items/6d4342232ca4433d2566). Ich möchte die CSV-Datei verarbeiten, wenn sie im Zielverzeichnis eingeht. Ich dachte, also werde ich den Code aufschreiben.
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;
}
}
Erstellen Sie nun ein Verzeichnis mit dem Namen ** BOX ** in ** C: \ Develop **,
Versuchen Sie, test.java überall zu kompilieren und die Klasse auszuführen. (* Diesmal laufe ich mit D: )
Beeindruckend! Wenn beim Kompilieren eine Fehlermeldung angezeigt wird: Anfänger: ** hier ** Dies ist hilfreich.
Führen Sie nun die Klassendatei aus. Versuchen Sie, eine geeignete Datei in das BOX-Verzeichnis zu stellen.
Hoppla! Die Beispiel-TXT, die ich in das Verzeichnis gestellt habe Es heißt ENTRY_CREATE und ENTRY_MODIFY.
Wenn ich die Datei aus dem Verzeichnis lösche, wird ENTRY_DELETE angezeigt.
Ich denke, dass Sie es verstehen können, nachdem Sie es tatsächlich verschoben haben, also habe ich das Bild eingefügt, als ich es zuerst verschoben habe Dies ist in test.java geschrieben. (Der Kommentar ist in meiner Interpretation geschrieben, daher habe ich möglicherweise einen Fehler gemacht ...) Die zweite Zeile ** WatchService watcher = FileSystems.getDefault (). NewWatchService (); ** Es scheint ein fester Satz zu sein, also werde ich ihn so verwenden, wie er ist, ohne tief nachzudenken.
Path dir = Paths.get("C://develop//BOX"); //"dir"Geben Sie das Verzeichnis an, in dem überwacht werden soll
WatchService watcher = FileSystems.getDefault().newWatchService(); //WatchService"watcher"Erstellt mit dem Namen
dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY); //"dir"Geben Sie das Ereignis an, in dem überwacht werden soll(Erstellen,Löschen,Veränderung)
for (;;) { //Implementieren Sie eine Endlosschleife, um auf ein Ereignis zu warten
WatchKey watchKey = watcher.take(); //Beobachterschlüssel vom Beobachter"watchKey"Bekommen
for (WatchEvent<?> event: watchKey.pollEvents()) { //Sie können die Liste, in der WatchEvent gespeichert ist, mit der pollEvents-Methode abrufen.
if (event.kind() == OVERFLOW) continue; //"OVERFLOW"Ist ein spezielles Überwachungsereignis, das anzeigt, dass das Ereignis verschwunden oder zerstört wurde
WatchEvent<Path> ev = cast(event);
Path name = ev.context(); //"name"Holen Sie sich in Ereigniskontext und legen Sie den Dateinamen fest
Path child = dir.resolve(name); //Vollständiger Pfad mit Auflösungsmethode("dir"Auf dem Weg von"name"Hinzugefügt)Der Satz
System.out.format("%s: %s\n", event.kind().name(), child); //Zum Zeitpunkt der Ausgabe [Ereignisname:Anweisungen zur Ausgabe mit [Vollständiger Pfad der Datei]
}
watchKey.reset(); //Setzen Sie die Uhrentaste zurück(Um den WatchKey-Status auf READY zurückzusetzen)
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();
}
}
}
Der Code, den ich oben geschrieben habe, hat sich gegenüber dem vorherigen Code nicht wesentlich geändert. Es ist fast nur kombiniert.
test.java
import java.nio.file.FileSystems; //Erforderlich für die Verzeichnisüberwachung
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; //Erforderlich, um CSV zu verarbeiten und auszugeben
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")); //Dieses Mal ist das zu überwachende Verzeichnis eine Umgebungsvariable."CSV_DIR"Einstellen
WatchService watcher = FileSystems.getDefault().newWatchService();
dir.register(watcher, ENTRY_CREATE); //Diesmal ENTRY_OK, wenn nur CREATE erkannt wird
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); //Übergeben Sie den vollständigen Pfad der erkannten Datei an die vom Prozess gelesene Datei
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){ //Das Folgende ist das gleiche wie das vorherige
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();
}
}
}
Da japanische Kommentare und ★ Markierungen in der Java-Datei enthalten sind Javac allein führt zu einem Kompilierungsfehler: Schweiß: : schädel: Fehler: Dieses Zeichen kann nicht der Codierung von MS932 zugeordnet werden, daher wird es angezeigt. Dieses Mal kompiliere ich mit ** javac -encodhing utf-8 test.java **. Lass es uns laufen.
Ich habe die Umgebungsvariable "CSV_DIR" auf den Speicherort C: \ Develop \ Monitored gesetzt. (Dieses überwachte Verzeichnis) Fügen Sie die CSV-Datei, die Sie verarbeiten möchten, in diese ein.
Der Name der Datei, die Sie in das Verzeichnis gestellt haben, wird nach erfolgreicher Ausgabe angezeigt :.
Überprüfen Sie das Tedkuma-Verzeichnis des als Ausgabeziel angegebenen D-Laufwerks. Eine Datei mit einem Stern am Anfang des Dateinamens wird ausgegeben, und die darin enthaltene CSV wird ebenfalls verarbeitet.
Diese Zeit ist vorbei.
Recommended Posts