epw2wea: New file converter for EnergyPlus weather to DaySim
authorAxel Jacobs <axel@jaloxa.eu>
Sun, 15 Dec 2013 23:13:40 +0000
changeset 49 66e192fe711e
parent 48 de81adde2cae
child 50 34f10b8485c9
epw2wea: New file converter for EnergyPlus weather to DaySim
bin/epw2wea.pl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/epw2wea.pl	Sun Dec 15 23:13:40 2013 +0000
@@ -0,0 +1,118 @@
+#!/usr/bin/perl
+#
+# Convert EnergyPlus EPW weather file to DaySim wea format or CSV
+#
+# Axel Jacobs, 15 Dec 2013
+
+use strict;
+use warnings;
+
+my $output;           # Default output is to STDOUT
+my $csv = 0;          # Output CSV file, not DaySim wea format
+my $delimiter = ' ';  # Delimiter. Default is ' ' which is for DaySim wea
+my $delim = ' ';
+
+while (@ARGV) {
+	$_ = $ARGV[0];
+	if (m/-o/) {         # Output file. Default is STDOUT
+		$output = $ARGV[1];
+		shift @ARGV;
+	} elsif (m/-c/) {    # Output CSV file, not DaySim wea format
+		$csv = 1;
+	} elsif (m/-d/) {    # Delimiter for CSV output
+		$delim = $ARGV[1];
+		shift @ARGV;
+	} elsif (m/^-\w/) {
+		die("epw2wea: Bad option: $_\n");
+	} else {
+		last;
+	}
+	shift @ARGV;
+}
+if ($csv == 1) {
+	$delimiter = $delim;     # Delimiter for CSV output
+}
+
+if ($output) {
+   open(OUTPUT, '>', $output)
+			or die("Cannot open file '$output' for writing: $!\n");
+} else {
+   *OUTPUT = *STDOUT;
+}
+
+# Extract latitude, longitude etc from first input line
+my $line = <>;
+#$line =~ s/\r//;    # Remove DOS line ending
+chomp $line;
+my @fields = split(/,/, $line);
+my $city = $fields[1];
+my $country = $fields[3];
+my $lat = $fields[6];
+my $lon = -1 * $fields[7];
+my $mer = -15 * $fields[8];
+my $ele = $fields[9];
+
+if ($csv == 1) {
+	my @epw_header = ('Year', 'Month', 'Day', 'Hour', 'Minute',
+			'Uncertainty', 'DryBulb', 'DewPoint', 'RelHum', 'Press',
+			'Ees0', 'Eesn0', 'Eird', 'Eeg', 'Eesn', 'Eed',
+			'Evg', 'Evsn', 'Evd', 'Lz',
+			'WindDir', 'WindSpeed',
+			'TotalSkyCover', 'OpaqueSkyCover', 'Visibility', 'Ceiling',
+			'PresentObs', 'PresentCode',
+			'PrecWater', 'AerosolOpticalDepth', 'SnowDepth', 'LastSnowfall'
+	);
+	print OUTPUT join($delimiter, @epw_header) . "\n";
+} else {
+	print OUTPUT <<EndOfHeader;
+place ${city}_$country
+latitude $lat
+longitude $lon
+time_zone $mer
+site_elevation $ele
+weather_data_file_units 1
+EndOfHeader
+}
+
+# Get rid of remaining header rows
+for (my $i = 7; $i >= 1; $i--) {
+	$line = <>;
+}
+
+
+# Process body
+while (<>) {
+	my $line = $_;
+	$line =~ s/\r//g;    # Remove DOS line ending
+	chomp $line;
+	@fields = split(/,/, $line);
+	my $month = $fields[1];
+	my $day   = $fields[2];
+	my $hour  = $fields[3];
+	my $hour2 = sprintf '%.3f', $hour - .5;
+	# Ignore minute column.
+	my $Eeg   = $fields[13];
+	my $Eesn  = $fields[14];
+	my $Eed   = $fields[15];
+	my $Evg   = $fields[16];
+	my $Evsn  = $fields[17];
+	my $Evd   = $fields[18];
+	my @columns = ();
+	if ($csv == 1) {
+		# Output all columns if CSV output is requested
+		@columns = @fields;
+	} else {
+		# Only output the columns relevant to DaySim wea format
+		@columns = (
+			$month,
+			$day,
+			$hour2,
+			$Eesn,
+			$Eed
+		);
+	}
+	print OUTPUT join($delimiter, @columns) . "\n";
+}
+close(OUTPUT);
+
+#EOF