3 line read from txt file - java
txt file read and 1~3 line is send Mesaage and 3~6 line read message send
but 1~3 read after send, next Again 1~3 line read after send...
I want 3 line read Repeat from txt file
test.txt
1|11221234|c1|c2|c3|c4
2|11221234|c1|c2|c3|c4
3|11221234|c1|c2|c3|c4
4|11221234|c1|c2|c3|c4
5|11221234|c1|c2|c3|c4
6|11221234|c1|c2|c3|c4
7|11221234|c1|c2|c3|c4
8|11221234|c1|c2|c3|c4
9|11221234|c1|c2|c3|c4
9|11221234|c1|c2|c3|c4
10|11221234|c1|c2|c3|c4
11|11221234|c1|c2|c3|c4
12|11221234|c1|c2|c3|c4
13|11221234|c1|c2|c3|c4
while ((s = in.readLine()) != null) {
cnt++;
Element record = new Element("RECORD");
String[] arr = s.split("│");
if (arr.length == tableInfoMap.size()) {
for (int i = 0; i < arr.length; i++) {
int j = i + 1;
String fieldName = (String) tableInfoMap
.get("COLUMN" + j);
Element field = new Element(fieldName);
field.addContent(new CDATA(arr[i]));
record.addContent(field);
}
} else {
throw new ArrayIndexOutOfBoundsException(" ");
}
rootElement.addContent(record);
if (cnt >= 3) {
sendMsg(srcTblName, tgtTblName, classPath,
className, doc, comm, sndAgency, rcvAgency,
cnt);
cnt = 0;
}
}
if (cnt > 0) {
boolean isSend = sendMsg(srcTblName, tgtTblName,
classPath, className, doc, comm, sndAgency,
rcvAgency, cnt);
in.close();
if (isSend == true) {
File f = new File(file);
if (f.delete() == true) {
logger.info("Send File Success: " + file);
logger.debug(f.getPath());
} else {
logger.warn("Send File Fail: " + file);
logger.debug(f.getPath());
}
}
}
Unsure what the question is but the | character in the split() requires escaping (the argument to split() is a regular expression and not a plain string):
String[] arr = s.split("\\│"); // Match | character only.
Related
Java, Spring Boot: Question about numberformatexception
this NumberFormatException is driving me insane. I cannot seem to find any reason for the exception. For context i am running a maven built spring boot application as a jar when the error occurs. It is running without errors inside the ide. The error message: java.lang.NumberFormatException: For input string: "9150287" The piece of code producing the error message: String substring = st.substring(indexLastAddedString + 1, i).trim(); System.out.println("Substring to be parsed: " + substring); number = Integer.parseInt(substring); So far i tried every method of parsing the string to integer. I also logged the string and tried different strings. //Edit Here is the minimal reproducible example: File file = new File("somefile.txt"); BufferedReader br = new BufferedReader(new FileReader(file)); String st;# int numberOfSemicolon = 0; int indexLastAddedString = 0; String description = ""; int adressNumber = -1; int number = 0; while ((st = br.readLine()) != null) { for(int i = 0; i < st.length(); i++) { if(st.charAt(i) == ';') { numberOfSemicolon++; } //add the description of project if(st.charAt(i) == ';' && numberOfSemicolon == 1) { description = st.substring(indexLastAddedString,i).replace("\""," "); indexLastAddedString = i; } //add the adresNumber of project if(st.charAt(i) == ';' && numberOfSemicolon == 2) { String identifier = st.substring(indexLastAddedString+1, i); adressNumber = customers.get(identifier) == null ? -1 : customers.get(identifier).getId(); indexLastAddedString = i; } //add the belegnumber of project if(st.charAt(i) == ';' && numberOfSemicolon == 3) { String substring = st.substring(indexLastAddedString + 1, i).trim(); System.out.println("Substring to be parsed: " + substring); try { } catch (NumberFormatException er) { er.printStackTrace(); } number = Integer.parseInt(substring); projects.add(new Project(number,description, adressNumber)); indexLastAddedString = i+1; numberOfSemicolon = 0; } } } The text file contains data in the following format (as an example): projectdescription;adressNumber;projectNumber;
How to write into csv sheet with below mentioned specific format
We need to get below format Redemption Reference Code|Status|Delivery company|Shipper Tracking Number|Comments 2006995040|Shipped|USPS|ABCD12345|Order SHIPPED 2006995042|Cancelled|||INVALID Address 2006995048|Ordered|USPS|ABCD12345|Order SHIPPED I am using below code private void accumulateOrdersFromPlacement(){ int count = 0; for (int i = 0; i < orderIds.size(); i++) { if (count == 0) { outPutLineData.add(orderIds.get(i)); outPutLineData.add("Cancelled"); outPutLineData.add(""); outPutLineData.add(" "); outPutLineData.add(" "); cancelledStatusLineItems.add(orderIds.get(i)); count++; } else if (count == 1) { outPutLineData.add(orderIds.get(i)); outPutLineData.add("Shipped"); if (outPutLineData.contains("Shipped")) { outPutLineData.add("USPS"); outPutLineData.add("order SHIPPED"); outPutLineData.add(""); } shippedStatusLineItems.add(orderIds.get(i)); count++; } else if (count == 2) { outPutLineData.add(orderIds.get(i)); outPutLineData.add("No Longer Available"); outPutLineData.add(""); outPutLineData.add(" "); outPutLineData.add(" "); count++; nlaStatusLineItems.add(orderIds.get(i)); } else if (count == 3) { outPutLineData.add(orderIds.get(i)); outPutLineData.add("Ordered"); outPutLineData.add(""); outPutLineData.add(" "); outPutLineData.add(" "); orderedStatusLineItems.add(orderIds.get(i)); count = 0; } } I am using below code for file creation. This is the detailed coding . This has more readability to understand code.Here i got confused about the code.We are taking order id count andbased on that this code is working. private File createFile(final File directory) { FileWriter fw = null; File tempFile = null; try { directory.mkdir(); tempFile = new File(".//FidelityFulfillment//" + generateFileName(countyThreeLetterCode, "FidelityFulfillment", ".csv", date)); logReport(GenericConstants.NEW_LINE + "Fulfillment file creating:", tempFile.getName()); fw = new FileWriter(tempFile, true); try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile, true))) { writer.write(generateHeaderLine()); writer.newLine(); for (int y = 1; y < outPutLineData.size(); y++) { if (y % 5 < 4) { writer.write(outPutLineData.get(y-1) + fieldSeperator); logReport(outPutLineData.get(y - 1) + fieldSeperator); } else { writer.write(outPutLineData.get(y-1)); logReport(outPutLineData.get(y)); } if (y % 5 == 0) { writer.newLine(); logReport("newline"); } } writer.close(); } catch (final IOException e) { e.printStackTrace(); final String err = "Unable to write file due to : " + e; logReport(GenericConstants.NEW_LINE + "Unable to create temp local File"); } finally { fw.close(); } }catch (Exception e){ e.printStackTrace(); } return tempFile; } Getting response as Redemption Reference Code|Status|Delivery company|ShipperTrackingNumber|Comments 2006964032|Cancelled|| | newline 2006964034|Shipped|USPS|| newline 2006964036|No Longer Available|| Last line one pipline is getting missing
First, you loop in a strange way : for (int y = 1; y < outPutLineData.size(); y++) { In general, we start at 0. But you tried to correct that with the condition : if (y % 5 < 4) { //System.out.print("size:"+y); writer.write(outPutLineData.get(y-1) + fieldSeperator); logReport(outPutLineData.get(y - 1) + fieldSeperator); } else { //System.out.print("size noseperator:"+y); writer.write(outPutLineData.get(y-1)); logReport(outPutLineData.get(y)); } Instead, simply use an iterator to read the values, then on read the correct amount of values : Iterator<String> it = outPutLineData.iterator(); while(it.hasNext()){ for (int j = 0; j < columnCount; ++j) { writer.write(it.next()); if( j < columnCount - 1) writer.write(fieldSeperator); } writer.newLine(); } Example with a StringBuilder to print in console : int columnCount = 2; String fieldSeperator = "|"; List<String> list = Arrays.asList("foo", "1", "bar", "2"); Iterator<String> it = list.iterator(); //Safe guard ! if(list.size() % columnCount != 0) throw new RuntimeException("The list does have the correct amount of data"); while(it.hasNext()){ for (int j = 0; j < columnCount; ++j) { sb.append( it.next() ); if( j < columnCount - 1) sb.append(fieldSeperator ); } System.out.println(sb.toString()); sb.setLength(0); } foo|1 bar|2 Use a POJO You are using a List<String> to hold the values, you need to know how many column you need to read to get the value. Instead, use a POJO : public class Redemption{ String redemptionReference; String code; String status; String deliveryCompany; String shipperTrackingNumber; String comments; } And create the instance in your first loop : List<Redemption> list... That way, you just need to iterate each instance to build your row : for(Redemption r: list){ writer.write(r.getRedemptionReference() + fieldSeperator); ... writer.write(r.getComments()); writer.newLine(); } Of course, you need to use getter and setter but this is just to show what you should do. CSV API Big warning, writing your own CSV writer is dangerous. If you have a comment like "This is a | character". You will end up with a line like : 2006995040|Shipped|USPS|This is a | character|Order SHIPPED That one column to many... because you should have 2006995040|Shipped|USPS|"This is a | character"|Order SHIPPED But you are not checking that case, and this is only one case. Using a CSV API is safer and simpler. See Any good library to read and write csv files?
HashMap key that is made up of multiple tokens and has non-null value mapping returns null
I am creating a currency exchange application from csv data and have hit a road block. I am storing the main currency exchange rate table in a LinkedHashMap of the following type: LinkedHashMap[String,LinkedHashMap[String,Double]] It will store the data as [Country, [Year,Rate]]. When I print to the console to confirm that the Map is being populated properly, I receive confirmation of a full KeySet and proper value mappings. Additionally, the application runs smoothly for any country names consisting of only one token. However, countries with more than one token in their names return null even though the map is populated with that key and its correct corresponding value. For example, printing getExchangeRates() will return all K-V pairs including the following: Australia={1960=0.8929, 1961=0.8929, 1962=0.8929, 1963=0.8929, 1964=0.8929, 1965=0.8929...}, Czech Republic={1990=21.145, 1991=27.92, 1992=28.37, 1993=29.153, 1994=28.785, 1995=26.541...}, New Zealand={1960=0.7143, 1961=0.7155, 1962=0.7192, 1963=0.7192, 1964=0.7192, 1965=0.7192...} Printing getExchangeRates().get("Australia") will return the LinkedHashMap of years and rates; however, printing getExchangeRates().get("Czech Republic") or getExchangeRates().get("New Zealand") will return null. Does anyone know why this would be happening? I am befuddled. Code and csv snippet included for reference, but as I said, the HashMap appears to be populating correctly. ,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Australia,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8929,0.8827,0.8387,0.7041,0.6967,0.7639,0.8183,0.9018,0.8737,0.8946,0.8782,0.8702,0.9859,1.11,1.1395,1.4319,1.496,1.4282,1.2799,1.2646,1.2811,1.2838,1.3617,1.4706,1.3678,1.349,1.2779,1.3474,1.5918,1.55,1.7248,1.9334,1.8406,1.5419,1.3598,1.3095,1.328,1.1951,1.1922 Austria,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.88949,1.81394,1.67985,1.42293,1.35844,1.26573,1.30373,1.20106,1.05533,0.97145,0.94024,1.15745,1.23975,1.30544,1.45412,1.50356,1.1095,0.91877,0.89734,0.96151,0.82628,0.84852,0.79862,0.84534,0.83005,0.73265,0.76936,0.88691,0.89962,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Belgium,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.21145,1.09109,0.9662,0.96558,0.91173,0.957,0.88852,0.78067,0.72679,0.72488,0.92041,1.13264,1.26752,1.43243,1.47194,1.10739,0.92549,0.91146,0.9768,0.82841,0.84651,0.79697,0.85762,0.82936,0.73079,0.76752,0.88681,0.89982,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Canada,0.9698,1.0131,1.0701,1.0811,1.0811,1.0811,1.0811,1.0811,1.0811,1.0811,1.0477,1.0098,0.9899,1.0001,0.978,1.0172,0.986,1.0635,1.1407,1.1714,1.1692,1.1989,1.2337,1.2324,1.2951,1.3655,1.3895,1.326,1.2307,1.184,1.1668,1.1457,1.2087,1.2901,1.3656,1.3724,1.3635,1.3846,1.4835,1.4857,1.4851,1.5488,1.5693,1.4011,1.301,1.2118,1.1344,1.0741,1.067 Czech Republic,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,21.145,27.92,28.37,29.153,28.785,26.541,27.145,31.698,32.281,34.569,38.598,38.035,32.739,28.209,25.7,23.957,22.596,20.294,17.072 Denmark,6.9071,6.9071,6.9071,6.9071,6.9071,6.9071,6.9071,6.9565,7.5,7.5,7.5,7.4169,6.9493,6.0495,6.0949,5.7462,6.045,6.0032,5.5146,5.261,5.6359,7.1234,8.3324,9.145,10.3566,10.5964,8.091,6.8403,6.7315,7.3102,6.1886,6.3965,6.0361,6.4839,6.3606,5.6024,5.7987,6.6045,6.7008,6.9762,8.0831,8.3228,7.8947,6.5877,5.9911,5.9969,5.9468,5.4437,5.0981 Finland,0.5382,0.5382,0.5382,0.5382,0.5382,0.5382,0.5382,0.58025,0.70638,0.70638,0.70638,0.70375,0.69736,0.64267,0.6347,0.61871,0.64995,0.6777,0.69249,0.65515,0.62735,0.72577,0.81074,0.93682,1.01081,1.04241,0.85263,0.73928,0.7035,0.72173,0.64307,0.68015,0.75339,0.96074,0.87853,0.73442,0.77258,0.87314,0.89881,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 France,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.75266,0.79185,0.84673,0.84496,0.769,0.67959,0.7339,0.65343,0.72855,0.74907,0.68802,0.64858,0.64419,0.8285,1.00191,1.16186,1.33227,1.36978,1.05588,0.91633,0.90812,0.97264,0.83013,0.86014,0.80704,0.86335,0.8464,0.76095,0.77986,0.8898,0.89938,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Germany,2.14743,2.06221,2.04517,2.04517,2.04517,2.04517,2.04517,2.04517,2.04517,2.01619,1.87133,1.78481,1.63033,1.36648,1.3231,1.25793,1.28743,1.18731,1.027,0.93714,0.92936,1.15552,1.2407,1.30546,1.45511,1.50523,1.11026,0.91899,0.89795,0.96125,0.82611,0.84851,0.79846,0.84533,0.82972,0.73275,0.76938,0.88661,0.8997,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Greece,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08804,0.08694,0.08804,0.09406,0.10717,0.10811,0.10784,0.1087,0.12507,0.16261,0.19605,0.25844,0.33079,0.40534,0.4108,0.39745,0.41632,0.47665,0.46519,0.5349,0.55942,0.67278,0.71197,0.67986,0.70642,0.80134,0.86729,0.89698,1.07234,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Hungary,..,..,..,..,..,..,..,..,60,60,60,59.82,55.26,48.97,46.75,43.97,41.58,40.96,37.91,35.58,32.53,34.31,36.63,42.67,48.04,50.12,45.83,46.97,50.41,59.07,63.21,74.74,78.99,91.93,105.16,125.68,152.65,186.79,214.4,237.15,282.18,286.49,257.89,224.31,202.75,199.58,210.39,183.63,172.11 Iceland,0.344,0.401,0.43,0.43,0.43,0.43,0.43,0.442,0.622,0.88,0.88,0.88,0.883,0.901,1,1.537,1.822,1.989,2.711,3.526,4.798,7.224,12.352,24.843,31.694,41.508,41.104,38.677,43.014,57.042,58.284,58.996,57.546,67.603,69.944,64.692,66.5,70.904,70.958,72.335,78.616,97.425,91.662,76.709,70.192,62.982,70.18,64.055,87.948 Ireland,0.45347,0.45347,0.45347,0.45347,0.45347,0.45347,0.45347,0.45977,0.52906,0.52906,0.52906,0.52176,0.50839,0.51827,0.54313,0.57397,0.70662,0.7279,0.66217,0.62038,0.61792,0.78889,0.89461,1.02173,1.1714,1.20068,0.94358,0.85443,0.83354,0.89585,0.76767,0.78888,0.74625,0.85993,0.84898,0.79198,0.79362,0.83757,0.8917,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Italy,0.32226,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32279,0.32017,0.30121,0.30109,0.33587,0.33717,0.42987,0.45572,0.4383,0.4291,0.44232,0.58709,0.69851,0.78442,0.90739,0.98614,0.76994,0.66936,0.67223,0.70863,0.61877,0.64072,0.63649,0.81273,0.83276,0.84127,0.79687,0.87958,0.89668,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Japan,360,360,360,360,360,360,360,360,360,360,360,349.33,303.17,271.7,292.08,296.79,296.55,268.51,210.44,219.14,226.74,220.54,249.08,237.51,237.52,238.54,168.52,144.64,128.15,137.96,144.79,134.71,126.65,111.2,102.21,94.06,108.78,120.99,130.91,113.91,107.77,121.53,125.39,115.93,108.19,110.22,116.3,117.75,103.36 Korea,..,..,..,..,..,..,271.3,270.5,276.7,288.2,310.6,347.2,392.9,398.3,404.5,484,484,484,484,484,607.4,681,731.1,775.8,806,870,881.5,822.6,731.5,671.5,707.8,733.4,780.7,802.7,803.4,771.3,804.5,951.3,1401.4,1188.8,1131,1291,1251.1,1191.6,1145.3,1024.1,954.8,929.3,1102.1 Luxembourg,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.23947,1.21145,1.09109,0.9662,0.96558,0.91173,0.957,0.88852,0.78067,0.72679,0.72488,0.92041,1.13264,1.26752,1.43243,1.47194,1.10739,0.92549,0.91146,0.9768,0.82841,0.84651,0.79697,0.85762,0.82936,0.73079,0.76752,0.88681,0.89982,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Mexico,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.013,0.015,0.023,0.023,0.023,0.023,0.025,0.056,0.12,0.168,0.257,0.612,1.378,2.273,2.462,2.813,3.018,3.095,3.116,3.375,6.419,7.599,7.918,9.136,9.56,9.456,9.342,9.656,10.789,11.286,10.898,10.899,10.928,11.13 Netherlands,1.72436,1.6563,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.64268,1.58933,1.45641,1.26857,1.21993,1.14761,1.19977,1.11369,0.98179,0.91028,0.90217,1.13227,1.21169,1.29515,1.45604,1.50719,1.11177,0.91922,0.89693,0.96235,0.82631,0.84842,0.79796,0.84281,0.82588,0.72863,0.76503,0.88545,0.90018,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 New Zealand,0.7143,0.7155,0.7192,0.7192,0.7192,0.7192,0.7192,0.7337,0.8929,0.8929,0.8929,0.8806,0.8368,0.7368,0.7154,0.8323,1.0049,1.0303,0.9644,0.9785,1.0267,1.1528,1.3326,1.4968,1.764,2.0234,1.9132,1.6946,1.5264,1.6722,1.6762,1.7335,1.8618,1.8505,1.6865,1.5239,1.4549,1.5124,1.8683,1.8896,2.2012,2.3788,2.1622,1.7221,1.5087,1.4203,1.5421,1.3607,1.4227 Norway,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.1429,7.0418,6.5883,5.7658,5.5397,5.2269,5.4565,5.3235,5.2423,5.0641,4.9392,5.7395,6.454,7.2964,8.1615,8.5972,7.3947,6.7375,6.517,6.9045,6.2597,6.4829,6.2145,7.0941,7.0576,6.3352,6.4498,7.0734,7.5451,7.7992,8.8018,8.9917,7.9838,7.0802,6.7408,6.4425,6.4133,5.8617,5.64 Poland,..,..,..,..,..,..,0.0004,0.0004,0.0004,0.0004,0.0004,0.0004,0.0004,0.0003,0.0003,0.0003,0.0003,0.0003,..,0.004,0.0044,0.0051,0.0085,0.0092,0.0113,0.0147,0.0175,0.0265,0.0431,0.1439,0.95,1.0576,1.3626,1.8115,2.2723,2.425,2.6961,3.2793,3.4754,3.9671,4.3461,4.0939,4.08,3.8891,3.6576,3.2355,3.1032,2.768,2.4092 Portugal,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.1434,0.14122,0.13494,0.12228,0.12673,0.12746,0.15078,0.19092,0.21916,0.24403,0.24971,0.30699,0.39641,0.55257,0.73019,0.84993,0.74614,0.70272,0.71804,0.7854,0.71106,0.72067,0.67337,0.80207,0.82797,0.75371,0.76937,0.87445,0.89835,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Slovak Republic,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,1.0214,1.0637,0.9863,1.0175,1.1159,1.1695,1.373,1.5281,1.6051,1.5046,1.2206,1.0707,1.0296,0.9858,0.8197,0.7091 Spain,0.36061,0.36061,0.36061,0.36061,0.36061,0.36061,0.36061,0.37063,0.42071,0.42071,0.42071,0.41752,0.38628,0.35015,0.3467,0.34502,0.4021,0.45654,0.46078,0.40343,0.43094,0.55487,0.66027,0.86203,0.96619,1.02199,0.84171,0.74212,0.7001,0.71147,0.61264,0.62452,0.61531,0.76485,0.8051,0.7494,0.76125,0.87997,0.89788,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Sweden,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1732,5.1168,4.7624,4.3673,4.4394,4.1522,4.3559,4.4816,4.5185,4.2871,4.2296,5.0634,6.2826,7.6671,8.2718,8.6039,7.1236,6.3404,6.1272,6.4469,5.9188,6.0475,5.8238,7.7834,7.716,7.1333,6.706,7.6349,7.9499,8.2624,9.1622,10.3291,9.7371,8.0863,7.3489,7.4731,7.3783,6.7588,6.5911 Switzerland,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.373,4.1342,3.8193,3.1648,2.9793,2.5813,2.4996,2.4035,1.788,1.6627,1.6757,1.9642,2.0303,2.0991,2.3497,2.4571,1.7989,1.4912,1.4633,1.6359,1.3892,1.434,1.4062,1.4776,1.3677,1.1825,1.236,1.4513,1.4498,1.5022,1.6888,1.6876,1.5586,1.3467,1.2435,1.2452,1.2538,1.2004,1.0831 Turkey,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,0.0001,0.0001,0.0002,0.0002,0.0004,0.0005,0.0007,0.0009,0.0014,0.0021,0.0026,0.0042,0.0069,0.011,0.0296,0.0458,0.0814,0.1519,0.2607,0.4188,0.6252,1.2256,1.5072,1.5009,1.4255,1.3436,1.4285,1.3029,1.3015 United Kingdom,0.35714,0.35714,0.35714,0.35714,0.35714,0.35714,0.35714,0.3621,0.41667,0.41667,0.41667,0.41092,0.40039,0.40817,0.42776,0.45204,0.55651,0.57327,0.52151,0.47218,0.4303,0.49764,0.57245,0.65973,0.75181,0.77925,0.6822,0.61193,0.56217,0.61117,0.56318,0.56702,0.56977,0.66676,0.65343,0.63367,0.64096,0.61084,0.60382,0.61806,0.66093,0.69466,0.66722,0.61247,0.54618,0.55,0.54349,0.49977,0.54397 United States,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 Euro area,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.76452,0.78756,0.8818,0.89199,0.93863,1.0854,1.11751,1.06255,0.88603,0.80537,0.80412,0.79714,0.73064,0.68268 Brazil,0.0001,0.0001,0.0001,0.0002,0.0005,0.0007,0.0009,0.001,0.0013,0.0016,0.0018,0.002,0.0023,0.0024,0.0026,0.0031,0.0041,0.0055,0.007,0.0104,0.0203,0.0359,0.0693,0.2227,0.7131,2.3925,5.2694,15.137,79.6677,-,-,0.0001,0.0016,0.0322,0.6393,0.9177,1.0051,1.078,1.1605,1.8139,1.8294,2.3496,2.9204,3.0775,2.9251,2.4344,2.1753,1.9471,1.8338 Chile,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,396.77,412.27,419.3,460.29,508.78,539.59,634.94,688.94,691.4,609.53,559.77,530.28,522.46,522.46 China,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.462,2.245,1.989,1.961,1.86,1.941,1.858,1.684,1.555,1.498,1.705,1.893,1.976,2.32,2.937,3.453,3.722,3.722,3.765,4.783,5.323,5.515,5.762,8.619,8.351,8.314,8.29,8.279,8.278,8.279,8.277,8.277,8.277,8.277,8.194,7.973,7.608,6.949 Estonia,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,13.223,12.991,11.465,12.038,13.882,14.075,14.678,16.969,17.478,16.612,13.856,12.596,12.584,12.466,11.434,10.694 India,4.77,4.78,4.77,4.78,4.79,4.79,6.3,7.56,7.58,7.59,7.57,7.52,7.59,7.74,8.1,8.38,8.96,8.74,8.19,8.13,7.86,8.66,9.46,10.1,11.36,12.37,12.61,12.96,13.92,16.23,17.5,22.74,25.92,30.49,31.37,32.43,35.43,36.31,41.26,43.06,44.94,47.19,48.61,46.58,45.32,44.1,45.31,41.35,43.51 Indonesia,..,..,..,..,..,..,..,150,296,326,363,392,415,415,415,415,415,415,442,623,627,632,661,909,1026,1111,1283,1644,1686,1770,1843,1950,2030,2087,2161,2249,2342,2909,10014,7855,8422,10261,9311,8577,8939,9705,9159,9141,9699 Israel 1,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,3.0113,3.1917,3.4494,3.8001,4.1397,4.0773,4.2057,4.7378,4.5541,4.482,4.4877,4.4558,4.1081,3.588 Russian Federation,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.992,2.191,4.559,5.121,5.785,9.705,24.62,28.129,29.169,31.349,30.692,28.814,28.284,27.191,25.581,24.853 Slovenia,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,..,0.11505,0.3392,0.47255,0.53751,0.49457,0.56486,0.66637,0.69326,0.75851,0.92913,1.01297,1.00254,0.86427,0.80279,0.80414,0.79715,0.73064,0.68268 South Africa,0.713,0.715,0.713,0.715,0.717,0.716,0.717,0.717,0.717,0.718,0.716,0.712,0.773,0.694,0.679,0.74,0.87,0.87,0.87,0.842,0.779,0.878,1.086,1.114,1.475,2.229,2.285,2.036,2.273,2.623,2.587,2.761,2.852,3.268,3.551,3.627,4.299,4.608,5.528,6.109,6.94,8.609,10.541,7.565,6.46,6.359,6.772,7.045,8.261 public static ArrayList<String> getYears() throws IOException { File file = new File("exchangerates.csv"); BufferedReader br = new BufferedReader(new FileReader(file)); ArrayList<String> years = new ArrayList<String>(); String line = br.readLine(); String year = ""; for(int i = 1; i < line.length(); i++) { if(line.charAt(i) != ',' && i != line.length()-1) { year = year + line.charAt(i); } else if(i == line.length()-1) { year = year + line.charAt(i); years.add(year); } else { years.add(year); year = ""; } } br.close(); return years; } public static LinkedHashMap<String,LinkedHashMap<String,Double>> getExchangeRates() throws IOException { File file = new File("exchangerates.csv"); BufferedReader br = new BufferedReader(new FileReader(file)); //burn first line br.readLine(); LinkedHashMap<String,LinkedHashMap<String,Double>> exchangeRatesTable = new LinkedHashMap<String,LinkedHashMap<String,Double>>(); String line = null; while((line = br.readLine()) != null) { String country = ""; int index = 0; while(line.charAt(index) != ',') { country = country + line.charAt(index); index++; } index++; //skip comma LinkedHashMap<String,Double> yearlyRateMap = new LinkedHashMap<String,Double>(); for(String year : getYears()) { String rateString = ""; for(int k = index; k < line.length(); k++) { if(line.charAt(k) != ',' && k != line.length()-1) { rateString = rateString + line.charAt(k); index++; } else if(k == line.length()-1) { rateString = rateString + line.charAt(k); index++; if(!rateString.equals("..")) { Double exchangeRate = new Double(rateString); yearlyRateMap.put(year, exchangeRate); } else { index++; break; } break; } else { if(!rateString.equals("..") && !rateString.equals("-")) { index++; Double exchangeRate = new Double(rateString); yearlyRateMap.put(year, exchangeRate); } else { index++; break; } break; } } } exchangeRatesTable.put(country, yearlyRateMap); } br.close(); return exchangeRatesTable; }
How to step reader.readLine() in two for cycles ?
I am reading data from a txt file. I want to create new objects from every ten lines and "." indicates that the current object doesn't have any more data lines (I work with two types of object("Nemfuggetlen" and "fuggetlen"), "fuggetlen" has 9 and "Nemfuggetlen" has 7 lines, "." separates their data lines). The problem is: when I read two "Nemfuggetlen" objects in a row, it works fine, but if I read "fuggetlen" after "Nemfuggetlen" it makes "-------" to the next object first data lines, when it shouldn't. For "Nemfuggetlen" object it should fill the last 3 lines of "adatok" string array with "-------" and step to the next object. int sorokszama = 0; input.mark(300); while((s = input.readLine()) !=null){ sorokszama++; System.out.println("Sorok szama : " + sorokszama); input.reset(); for(int h = 0; h < sorokszama/10; h++){ for(int i = 0;(s = input.readLine()) !=null; i++) { if(i < 10){ if(!(".".equals(s))) { adatok[i] = s; System.out.println(adatok[i]); } else { adatok[i] = "-------"; System.out.println(adatok[i]); break; } } } if("Ferfi".equals(adatok[2])){ nem = true; } else { nem = false; } if("Van".equals(adatok[4])){ tamogato = true; } else{ tamogato = false; } if("-------".equals(adatok[7])){ //A kepviselo nem fuggetlen k = new Nemfuggetlen(adatok[0], Integer.parseInt(adatok[1]), nem, adatok[4], new Kerulet (Integer.parseInt(adatok[5])), adatok[6]); } if("-------".equals(adatok[9])){ // A kepviselo fuggetlen k = new Fuggetlen(adatok[0], Integer.parseInt(adatok[1]), nem, adatok[4], new Kerulet (Integer.parseInt(adatok[5])),tamogato, adatok[7], Integer.parseInt(adatok[8])); } kepviselok.add(k); //System.out.println(kepviselok.get(0)); } System.out.println("Kepviselok szama : " + sorokszama/10); for(int i = 0; i < kepviselok.size(); i++) { System.out.println((i+1) + ". tag : " + kepviselok.get(i)); } input.close();
Java File I/O help
I have a problem with my code. I need to do several operations on a log file with this structure: 190.12.1.100 2011-03-02 12:12 test.html 190.12.1.100 2011-03-03 13:18 data.html 128.33.100.1 2011-03-03 15:25 test.html 128.33.100.1 2011-03-04 18:30 info.html I need to get the number of visits per month, number of visits per page and number of unique visitors based on the IP. That is not the question, I managed to get all three operations working. The problem is, only the first choice runs correctly while the other choices just return values of 0 afterwards, as if the file is empty, so i am guessing i made a mistake with the I/O somewhere. Here's the code: import java.io.*; import java.util.*; public class WebServerAnalyzer { private Map<String, Integer> hm1; private Map<String, Integer> hm2; private int[] months; private Scanner input; public WebServerAnalyzer() throws IOException { hm1 = new HashMap<String, Integer>(); hm2 = new HashMap<String, Integer>(); months = new int[12]; for (int i = 0; i < 12; i++) { months[i] = 0; } File file = new File("webserver.log"); try { input = new Scanner(file); } catch (FileNotFoundException fne) { input = null; } } public String nextLine() { String line = null; if (input != null && input.hasNextLine()) { line = input.nextLine(); } return line; } public int getMonth(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); if (dtok.countTokens() == 3) { String year = dtok.nextToken(); String month = dtok.nextToken(); String day = dtok.nextToken(); int m = Integer.parseInt(month); return m; } } return -1; } public String getIP(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); return ip; } return null; } public String getPage(String line) { StringTokenizer tok = new StringTokenizer(line); if (tok.countTokens() == 4) { String ip = tok.nextToken(); String date = tok.nextToken(); String hour = tok.nextToken(); String page = tok.nextToken(); StringTokenizer dtok = new StringTokenizer(date, "-"); return page; } return null; } public void visitsPerMonth() { String line = null; do { line = nextLine(); if (line != null) { int m = getMonth(line); if (m != -1) { months[m - 1]++; } } } while (line != null); // Print the result String[] monthName = {"JAN ", "FEB ", "MAR ", "APR ", "MAY ", "JUN ", "JUL ", "AUG ", "SEP ", "OCT ", "NOV ", "DEC "}; for (int i = 0; i < 12; i++) { System.out.println(monthName[i] + months[i]); } } public int count() throws IOException { InputStream is = new BufferedInputStream(new FileInputStream("webserver.log")); try { byte[] c = new byte[1024]; int count = 0; int readChars = 0; while ((readChars = is.read(c)) != -1) { for (int i = 0; i < readChars; ++i) { if (c[i] == '\n') ++count; } } return count; } finally { is.close(); } } public void UniqueIP() throws IOException{ String line = null; for (int x = 0; x <count(); x++){ line = nextLine(); if (line != null) { if(hm1.containsKey(getIP(line)) == false) { hm1.put(getIP(line), 1); } else { hm1.put(getIP(line), hm1.get(getIP(line)) +1 ); } } } Set set = hm1.entrySet(); Iterator i = set.iterator(); System.out.println("\nNumber of unique visitors: " + hm1.size()); while(i.hasNext()) { Map.Entry me = (Map.Entry)i.next(); System.out.print(me.getKey() + " - "); System.out.println(me.getValue() + " visits"); } } public void pageVisits() throws IOException{ String line = null; for (int x = 0; x <count(); x++){ line = nextLine(); if (line != null) { if(hm2.containsKey(getPage(line)) == false) hm2.put(getPage(line), 1); else hm2.put(getPage(line), hm2.get(getPage(line)) +1 ); } } Set set = hm2.entrySet(); Iterator i = set.iterator(); System.out.println("\nNumber of pages visited: " + hm2.size()); while(i.hasNext()) { Map.Entry me = (Map.Entry)i.next(); System.out.print(me.getKey() + " - "); System.out.println(me.getValue() + " visits"); } } Any help figuring out the problem would be much appreciated as I am quite stuck.
I didn't read the code thoroughly yet, but I guess you're not setting the read position back to the beginning of the file when you start a new operation. Thus nextLine() would return null. You should create a new Scanner for each operation and close it afterwards. AFAIK scanner doesn't provide a method to go back to the first byte. Currently I could also think of 3 alternatives: Use a BufferedReader and call reset() for each new operation. This should cause the reader to go back to byte 0 provided you didn't call mark() somewhere. Read the file contents once and iterate over the lines in memory, i.e. put all lines into a List<String> and then start at each line. Read the file once, parse each line and construct an apropriate data structure that contains the data you need. For example, you could use a TreeMap<Date, Map<Page, Map<IPAdress, List<Visit>>>>, i.e. you'd store the visits per ip address per page for each date. You could then select the appropriate submaps by date, page and ip address.
The reset method of BufferedReader that Thomas recommended would only work if the file size is smaller than the buffer size or if you called mark with a large enough read ahead limit. I would recommend reading throught the file once and to update your maps and month array for each line. BTW, you don't need a Scanner just to read lines, BufferedReader has a readLine method itself. BufferedReader br = ...; String line; while (null != (line = br.readLine())) { String ip = getIP(line); String page = getPage(line); int month = getMonth(line); // update hashmaps and arrays }