したいので濾過し、最高の実績を教えてください。(JAVA)
-
21-09-2019 - |
質問
仕事をしている小規模なオフィスとして応用で生成する大きなテキストファイル14000線
後に発生しないとフィルターで本当にボーリン;
みっ書を使用してアプリケーショjavaのままで対応できます。
力を貸してください;しっかりとしたアプリスキャナーのコースのヘルプ)が良くない ユたので非常に遅くなり;
例えば、このファイル:
SET CELL:NAME=CELL:0,CELLID=3;
SET LSCID:NAME=LSC:0,NETITYPE=MDCS,T32=5,EACT=FILTER-NOFILTER-MINR-FILTER-NOFILTER,ENSUP=GV2&NCR,MINCELL=6,MSV=PFR,OVLHR=9500,OTHR=80,BVLH=TRUE,CELLID=3,BTLH=TRUE,MSLH=TRUE,EIHO=DISABLED,ENCHO=ENABLED,NARD=NAP_STLP,AMH=ENABLED(3)-ENABLED(6)-ENABLED(9)
やりたいこの出力フィルタ:)
CELLID : 3
ENSUP : GV2&NCR
ENCHO : ENABLED
MSLH : TRUE
------------------------
Count of CELLID : 2
るソリューションには、ストレスの最速のですか?
このソースコード:
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File("i:\\1\\2.txt"));
scanner.useDelimiter(";|,");
Pattern words = Pattern.compile("(CELLID=|ENSUP=|ENCHO=)");
while (scanner.hasNextLine()) {
String key = scanner.findInLine(words);
while (key != null) {
String value = scanner.next();
if (key.equals("CELLID="))
System.out.print("CELLID:" + value+"\n");
//continue with else ifs for other keys
else if (key.equals("ENSUP="))
System.out.print("ENSUP:" + value+"\n");
else if (key.equals("ENCHO="))
System.out.print("ENCHO:" + value+"\n");
key = scanner.findInLine(words);
}
scanner.nextLine();
}
}
誠にありがとうございました。...
解決
以降のコードは、性能の問題、すべてのボトルネックですね。できる形でプロファイラ用のIDEで利用します。
してコードを用いて計算がIO集中し、ファイルの読み込み、出力します。ます。印刷、私はあなたを改善向上のファイルIO.
.
ここに、日本国内のスタートアップ
Scanner scanner = new Scanner(new File("i:\\1\\2.txt"));
.
このコード
File file = new File("i:\\1\\2.txt");
BufferedReader br = new BufferedReader( new FileReader(file) );
Scanner scanner = new Scanner(br);
あればお知らせくださいこりませんでした。
.
従来の溶液になったり、少しの変更をコードです。して補正誤差の解析のばかりでした。この表示出力の解析392832線約5秒になっています。オリジナルソリューションより50秒です。
Chagesは下記の通りとなります。
- 利用StringTokenizerの代わりに スキャナー
- 利用BufferedReaderのためのファイルの読み込み
- 利用StringBuilderに出力バッファ
.
public class FileParse {
private static final int FLUSH_LIMIT = 1024 * 1024;
private static StringBuilder outputBuffer = new StringBuilder(
FLUSH_LIMIT + 1024);
private static final long countCellId;
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
String fileName = "i:\\1\\2.txt";
File file = new File(fileName);
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ";|, ");
while (st.hasMoreTokens()) {
String token = st.nextToken();
processToken(token);
}
}
flushOutputBuffer();
System.out.println("----------------------------");
System.out.println("CELLID Count: " + countCellId);
long end = System.currentTimeMillis();
System.out.println("Time: " + (end - start));
}
private static void processToken(String token) {
if (token.startsWith("CELLID=")) {
String value = getTokenValue(token);
outputBuffer.append("CELLID:").append(value).append("\n");
countCellId++;
} else if (token.startsWith("ENSUP=")) {
String value = getTokenValue(token);
outputBuffer.append("ENSUP:").append(value).append("\n");
} else if (token.startsWith("ENCHO=")) {
String value = getTokenValue(token);
outputBuffer.append("ENCHO:").append(value).append("\n");
}
if (outputBuffer.length() > FLUSH_LIMIT) {
flushOutputBuffer();
}
}
private static String getTokenValue(String token) {
int start = token.indexOf('=') + 1;
int end = token.length();
String value = token.substring(start, end);
return value;
}
private static void flushOutputBuffer() {
System.out.print(outputBuffer);
outputBuffer = new StringBuilder(FLUSH_LIMIT + 1024);
}
}
.
更新ENSUPとMSLH:
私のように認識していて切り替えENSUPとMSLHる場合のみ実行される。そのためだ"MSLH"価値"ENSUP"と副る。
} else if (token.startsWith("MSLH=")) {
String value = getTokenValue(token);
outputBuffer.append("ENSUP:").append(value).append("\n");
} else if (token.startsWith("ENSUP=")) {
String value = getTokenValue(token);
outputBuffer.append("MSLH:").append(value).append("\n");
}
他のヒント
(私は数年のためにそれを使用してきたので、私の選択を)または
は単純なテキストフィルタはPerlで書くことはおそらく簡単ですパイソン(それはより現代的な言語なので、私は新しい人にお勧めするもの)。
を使用して同様の問題にいくつかの解決策のJava スキャナのか、 StreamTokenizer のは最近でしたをここにを議論します。
所属していません StackOverflow