How to step reader.readLine() in two for cycles ? - java

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();

Related

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;
}

3 line read from txt file

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.

How do I get my array out of try/catch block?

I've been kicking this code around for a while and I think I know what the general problem is, I can't figure out how to correct it. I'm getting the following error:
C:\Documents and Settings\Joe King\My Documents\418.85A Java\Project5>javac Project5.java
Project5.java:408: error: variable boatNames might not have been initialized
boatArray1 = new Boat[boatNames.length];
^
1 error
The problem is my boatNames array is in a try/catch block and I think this is isolating it from the rest of the code. How can I get the boatNames array out of the try/catch block?
My code is as follows:
class Project5{
public static void main(String[] args){
String[] boatNames;
Boat[] boatArray1;
Boat[] boatArray2;
String result = " ";
String name = null;
char firstChar;
char firstLetter;
char secondLetter;
int totalRead;
int i;
int j;
int k;
int l;
int m;
Path inPath = Paths.get("C:/Documents and Settings/Joe King/My Documents/418.85A Java/Projects/Input").resolve("Boat Names.txt");
if(!Files.exists(inPath)){
System.out.println(inPath + " does not exist. Terminating the program.");
System.exit(1);
}
try(BufferedReader fileIn = Files.newBufferedReader(inPath, Charset.forName("UTF-16"))){
totalRead = 0;
while(fileIn.readLine() != null){
name = fileIn.readLine();
++totalRead;
name = null;
}
boatNames = new String[totalRead];
for(i = 0 ; i < boatNames.length ; ++i){
name = fileIn.readLine();
boatNames[i] = name;
name = null;
}
}catch(IOException e){
System.err.println("Error writing file: " + inPath);
e.printStackTrace();
}
Path outPath = Paths.get("C:/Documents and Settings/Joe King/My Documents/418.85A Java/Projects/Output").resolve("Fleet Registry.txt");
try{
Files.createDirectories(outPath.getParent());
}catch(IOException e){
System.err.println("Error creating directory: " + outPath.getParent());
e.printStackTrace();
System.exit(1);
}
boatArray1 = new Boat[boatNames.length];
if(boatNames.length > 0){
try(BufferedWriter fileOut = Files.newBufferedWriter(outPath, Charset.forName("UTF-16"))){
for(j = 0 ; j < boatNames.length ; j++){
String delimiters = "[. ,]";
int limit = -1;
String[]tokens = boatNames[j].split(delimiters, limit);
for(k = 0 ; k < tokens.length ; ++k){
firstChar = tokens[k].charAt(0);
firstChar = Character.toUpperCase(firstChar);
char[] tokenArray = tokens[k].toCharArray();
String text = new String(tokenArray, 1, (tokenArray.length - 1) );
tokens[k] = firstChar + text;
result = result + tokens[k] + " ";
if(k != tokens.length - 1){
continue;
}else{
result = result.trim();
boatNames[k] = result;
result = " ";
}
}
firstLetter = boatNames[j].charAt(0);
if((firstLetter == 'B') || (firstLetter == 'C') || (firstLetter == 'N')){
boatArray1[j] = new RaceBoat();
}else{
boatArray1[j] = new SailBoat();
}
boatArray1[j].christenBoat(boatNames[j]);
}
System.out.println("\n");
for(l = 0 ; l < boatNames.length ; ++l){
secondLetter = Character.toUpperCase(boatNames[l].charAt(1));
if((secondLetter == 'A') || (secondLetter == 'E')){
if(l > 0){
fileOut.newLine();
}
fileOut.write(boatArray1[l].goFast());
}else{
if(l > 0){
fileOut.newLine();
}
fileOut.write(boatArray1[l].goSlow());
}
fileOut.newLine();
fileOut.write(boatArray1[l].launchBoat());
fileOut.newLine();
fileOut.write(boatArray1[l].whatIsBoatState());
fileOut.newLine();
}
boatArray2 = new Boat[3];
boatArray2[0] = new SailBoat();
boatArray2[1] = new RaceBoat("Endurance", true);
boatArray2[2] = new RaceBoat(false);
for(m = 0 ; m < boatArray2.length ; ++m){
fileOut.newLine();
fileOut.write(boatArray2[m].toString());
fileOut.newLine();
fileOut.write(boatArray2[m].launchBoat());
fileOut.newLine();
fileOut.write(boatArray2[m].whatIsBoatState());
fileOut.newLine();
}
fileOut.newLine();
fileOut.write("There are " + Boat.boatCount + " boats in the fleet this morning.");
}catch(IOException e){
System.err.println("Error writing outPath: " + outPath);
e.printStackTrace();
}
}else{
System.out.println("\n\n\nArgh!... you forgot to enter ship names scalawag!" +
"\n\n\n\tPlease try again!");
}
System.out.println("\nThe Fleet Registry is completed, press ENTER to continue.\n");
try{
System.in.read();
} catch(IOException e){
return;
}
}
}
Thank you everyone, I've entered the following:
if(boatNames != null){
boatArray1 = new Boat[boatNames.length];
if(boatNames.length > 0){
try(BufferedWriter fileOut = Files.newBufferedWriter(outPath, Charset.forName("UTF-16"))){
for(j = 0 ; j < boatNames.length ; j++){
String delimiters = "[. ,]";
int limit = -1;
String[]tokens = boatNames[j].split(delimiters, limit);
for(k = 0 ; k < tokens.length ; ++k){
firstChar = tokens[k].charAt(0);
firstChar = Character.toUpperCase(firstChar);
char[] tokenArray = tokens[k].toCharArray();
String text = new String(tokenArray, 1, (tokenArray.length - 1) );
tokens[k] = firstChar + text;
result = result + tokens[k] + " ";
if(k != tokens.length - 1){
continue;
}else{
result = result.trim();
boatNames[k] = result;
result = " ";
}
}
firstLetter = boatNames[j].charAt(0);
if((firstLetter == 'B') || (firstLetter == 'C') || (firstLetter == 'N')){
boatArray1[j] = new RaceBoat();
}else{
boatArray1[j] = new SailBoat();
}
boatArray1[j].christenBoat(boatNames[j]);
}
System.out.println("\n");
for(l = 0 ; l < boatNames.length ; ++l){
secondLetter = Character.toUpperCase(boatNames[l].charAt(1));
if((secondLetter == 'A') || (secondLetter == 'E')){
if(l > 0){
fileOut.newLine();
}
fileOut.write(boatArray1[l].goFast());
}else{
if(l > 0){
fileOut.newLine();
}
fileOut.write(boatArray1[l].goSlow());
}
fileOut.newLine();
fileOut.write(boatArray1[l].launchBoat());
fileOut.newLine();
fileOut.write(boatArray1[l].whatIsBoatState());
fileOut.newLine();
}
boatArray2 = new Boat[3];
boatArray2[0] = new SailBoat();
boatArray2[1] = new RaceBoat("Endurance", true);
boatArray2[2] = new RaceBoat(false);
for(m = 0 ; m < boatArray2.length ; ++m){
fileOut.newLine();
fileOut.write(boatArray2[m].toString());
fileOut.newLine();
fileOut.write(boatArray2[m].launchBoat());
fileOut.newLine();
fileOut.write(boatArray2[m].whatIsBoatState());
fileOut.newLine();
}
fileOut.newLine();
fileOut.write("There are " + Boat.boatCount + " boats in the fleet this morning.");
}catch(IOException e){
System.err.println("Error writing outPath: " + outPath);
e.printStackTrace();
}
}else{
System.out.println("\n\n\nArgh!... you forgot to enter ship names scalawag!" +
"\n\n\n\tPlease try again!");
}
System.out.println("\nThe Fleet Registry is completed, press ENTER to continue.\n");
try{
System.in.read();
} catch(IOException e){
return;
}
}
Now I'm getting the following error:
C:\Documents and Settings\Joe King\My Documents\418.85A Java\Project5>java Project5
Exception in thread "main" java.lang.NullPointerException
at Project5.main(Project5.java:424)
This doesn't make sense to me, in order to get to line 424 the boatNames array cannot be null because the length of boatNames was used several times before line 424. What am I missing?
Thanks
The variable is out of the try/catch, otherwise the compile error would be different. The problem is that the initialization is inside the try block, so that code after the try can't be sure the variable was initialized.
There are two ways to deal with this:
Initialize the variable when you declare it. Just using this would be enough:
String[] boatNames = null;
Move all the code that uses the variable inside the try block. This is often a good strategy, but only if your methods are small. In your case, I wouldn't recommend this, as your method is much too long. Now, if you could break your code up into shorter methods, then limiting the scope of the variable to a single try block would make good sense.
Before the try/catch block, initialize the array like this:
String[] boatNames = null;
You have declared your array outside try block
String[] boatNames;
It will be initialized under first try block
boatNames = new String[totalRead];
Issue is here boatArray1 = new Boat[boatNames.length];
Reason, your compiler has no way to know if boatNames initialization will be successful as there might be an exception and initialization will fail.
As part of your declaration you can do this:
String[] boatNames = null; // This will fix your immediate problem
but doing this may lead you to NullPointerException since your File read can fail.
To solve this do a null check on your array before you use it.
if(boatNames == null){
// I am not going to go further or will take corrective measures here
}
The compiler here considers the possibility that an exception might be raised in the try block even before boatNames is initialized hence it gives the compiler error might not have been initialized. The might is important here!
The ideal solution here would be to tweak your code structure and put
boatArray1 = new Boat[boatNames.length];
in the same try block!

Adding commas to output

This is what it does:
2,
4,
6,
8,
10
I would like for it to be horizontal:
2, 4, 6, 8, 10
try {
PrintWriter fout = new PrintWriter(new BufferedWriter(new FileWriter("numbers.dat")));
for(int i = start; i <= 100; i = i + 2) {
fout.println(i+",");
}
Another attempt
for(int i = start; i <= 100; i += 2)
System.out.print(i + (i > 98 ? "\n" : ", "));
In the write() method:
for(int i = start; i <= 100; i = i + 2) {
if (i > start) {
fout.print(",");
}
fout.println(i);
}
Then when you call output(), it will display as comma separated list. And for screen display
while((outputline = fin.readLine()) != null) {
System.out.print(outputline + " ");
}
System.out.println();
Alternatively, skip saving the comma in the file and displaying will be as follows
int count = 0;
while((outputline = fin.readLine()) != null) {
if (count > 0)
System.out.print(", ");
System.out.print(outputline);
count++;
}
System.out.println();
If you mean to do it on printing to your .dat file:
for(int i = start; i <= 100; i = i + 2) {
fout.print(i);
if(i < 100) {
fout.print(", ");
} else {
fout.println();
}
}
If it is when printing to the system output after reading your file, try this:
try {
BufferedReader fin = new BufferedReader(new FileReader("numbers.dat"));
String outputline = "";
StringBuilder result = new StringBuilder();
while((outputline = fin.readLine()) != null) {
result.append(outputline).append(", ");
}
int length = result.length();
result.delete(length - 2, length);
System.out.println(result);
fin.close();
}
This uses a StringBuilder to build up your result and then removes the last , when it is done.
Here is a very basic example of what you could do:
int max=11;
for(int i = 0; i < max; i += 2){
System.out.print(i);
if(i < max-2){
System.out.print(", ");
}
}
fout.println(i + ", ");
System.out.println(outputline + ", ");
This will give you commas after all the numbers but it looks like you don't need one after the final number.
You will have to remove the last comma either by using indexOf or checking for the last iteration of your loop.

Categories

Resources