Ich bin neu bei JSL, aber mit Hilfe dieser Community konnte ich einen Code schreiben, um Luftqualitätsdaten von einer URL für einen bestimmten Schadstoff und einen bestimmten Zeitraum zu sammeln. Im Code funktioniert alles einwandfrei, außer wenn die URL keine Daten enthält und die For-Schleife unterbrochen wird. Gibt es eine Möglichkeit, eine Bedingung festzulegen, damit die For-Schleife die Tabelle ohne Daten ignoriert? Ich füge den Code unten ein. Wenn Sie 2021 als 'end_year' angeben, funktioniert der Code einwandfrei, aber wenn Sie 2022 als 'end_year' angeben, bricht der Code ab, da in der zweiten Jahreshälfte noch keine Daten vorhanden sind (Zeile 35).
Names Default To Here(1);
//************************************INPUT****************************//
parameter= "SO2"; // 1. Pick from "NO2", "OZONE", "PM25HR", "NOX", "NO", "CO", "SO2"//
start_year= 2019; // 2. Specify start year
end_year= 2021; // 3. specify end year
//--------------------------------------------------------------------------------------------------------------
//This URL downloads data from Jan 1st until June 30
dl_url1= "https://www.arb.ca.gov/aqmis2/display.php?sitelist=All&filefmt=csv&fname=" || parameter || "_PICKDATA_^temp_year^-6-30&datafmt=dvde&download=y&first_date=^temp_year^-1-1¶m=" || parameter || "&units=001&year=^temp_year^&county_name=--COUNTY--&basin=SC-South+Coast&latitude=--PART+OF+STATE--&report=PICKDATA&order=basin%2Ccounty_name%2Cs.name&submit=All+Sites&ptype=aqd&std15=&o3switch=new&hours=all&statistic=&qselect=Screened&start_mon=1&start_day=1&mon=6&day=30&rows=18";
tableList = {};
For(i = start_year, i <= end_year, i++,
temp_year= Char(i);
year_url = Eval Insert(dl_url1);
dt_temp = Open(year_url, columns(
New Column( "site", Character, "Nominal" ),
New Column( "date",
Numeric,
"Continuous",
Format( "yyyy-mm-dd", 10 ),
Input Format( "yyyy-mm-dd" )
)));
dt_temp << delete rows( Index( N Rows(dt_temp) - 11, N Rows( dt_temp) ) ); //this code deletes the last 11 rows of data
Insert Into( tableList, dt_temp << get name );
);
//This URL downloads data from July 1st 1st until Dec 31
dl_url2= "https://www.arb.ca.gov/aqmis2/display.php?sitelist=All&filefmt=csv&fname=" || parameter || "_PICKDATA_^temp_year^-12-31&datafmt=dvde&download=y&first_date=^temp_year^-7-1¶m=" || parameter || "&units=001&year=^temp_year^&county_name=--COUNTY--&basin=SC-South+Coast&latitude=--PART+OF+STATE--&report=PICKDATA&order=basin%2Ccounty_name%2Cs.name&submit=All+Sites&ptype=aqd&std15=&o3switch=new&hours=all&statistic=&qselect=Screened&start_mon=7&start_day=1&mon=12&day=31&rows=18";
For(i = start_year, i <= end_year, i++,
temp_year= Char(i);
year_url = Eval Insert(dl_url2);
dt_temp = Open(year_url, columns(
New Column( "site", Character, "Nominal" ),
New Column( "date",
Numeric,
"Continuous",
Format( "yyyy-mm-dd", 10 ),
Input Format( "yyyy-mm-dd" )
)));
dt_temp << delete rows( Index( N Rows(dt_temp) - 11, N Rows( dt_temp) ) );
Insert Into( tableList, dt_temp << get name );
);
//The following code concat all tables
all_dt= new Table("All " || parameter || " Data");
For( i = 1, i <= N Items( tableList ), i++,
Data Table(all_dt) << Concatenate(
Data Table( tableList[i] ),
append to first table(1)
);
Close( Data Table( tableList[i] ), No Save );
);
// Create Time (PST) Column
Data Table(all_dt) << New Column( "Column 4",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << Move Selected Columns( {:Column 4}, after( :start_hour ) );
Data Table(all_dt):Column 4 << Input Format( "m/d/y h:m" ) <<
Set Name( "Time (PST)" ) << Format( "m/d/y h:m", 19 ) <<
Set Formula( :date + :start_hour * 3600 );
// Create Month Column
Data Table(all_dt) << New Column( "Month",
Character,
"Nominal",
Formula( Substr( Format( :"Time (PST)"n, "Monddyyyy" ), 1, 3 ) )
) << Move Selected Columns( {:"Month"n}, after( :"Time (PST)"n ) );
// Create Year Column
Data Table(all_dt) << New Column( "Year",
Character,
"Nominal",
Formula( Substr( Format( :"Time (PST)"n, "Monddyyyy" ), 6, 4 ) )
) << Move Selected Columns( {:"Year"n}, after( :"Month"n ) );Sie könnten die URLs mit 0 Datenzeilen mit etwas wie diesem überspringen:
If(N Rows(dt_temp) > 0,
dt_temp << delete rows(Index(N Rows(dt_temp) - 11, N Rows(dt_temp)));
Insert Into(tableList, dt_temp << get name);
,
Close(dt_temp, no save);
);
Wenn Sie die for-Schleife in der ersten Tabelle ohne Daten stoppen (ausbrechen) möchten, können Sie Break() innerhalb der for-Schleife verwenden:
If(N Rows(dt_temp) == 0,
Close(dt_temp, no save);
break();
);
Vielen Dank @jthi für die prompte Antwort.