openstudio-standards 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openstudio-standards/exterior_lighting/create.rb +2 -2
  3. data/lib/openstudio-standards/exterior_lighting/data/convert_entryway_data.rb +94 -0
  4. data/lib/openstudio-standards/exterior_lighting/data/convert_parking_data.rb +82 -0
  5. data/lib/openstudio-standards/exterior_lighting/data/entryways.json +565 -0
  6. data/lib/openstudio-standards/exterior_lighting/data/parking.json +428 -0
  7. data/lib/openstudio-standards/exterior_lighting/information.rb +14 -14
  8. data/lib/openstudio-standards/hvac/components/create.rb +4 -4
  9. data/lib/openstudio-standards/hvac/components/modify.rb +2 -2
  10. data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +2 -2
  11. data/lib/openstudio-standards/hvac/exhaust/data/convert_typical_exhaust_data.rb +67 -0
  12. data/lib/openstudio-standards/infiltration/data/NISTInfiltrationCorrelations.json +3172 -0
  13. data/lib/openstudio-standards/infiltration/data/convert_infiltration_data.rb +87 -0
  14. data/lib/openstudio-standards/infiltration/infiltration.rb +3 -3
  15. data/lib/openstudio-standards/infiltration/nist_infiltration.rb +42 -42
  16. data/lib/openstudio-standards/refrigeration/create_case.rb +2 -2
  17. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +22 -21
  18. data/lib/openstudio-standards/service_water_heating/create_typical.rb +1 -1
  19. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -0
  20. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +10 -2
  21. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +131 -107
  22. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +24 -24
  23. data/lib/openstudio-standards/utilities/ruleset_check.rb +1 -2
  24. data/lib/openstudio-standards/version.rb +1 -1
  25. data/lib/openstudio-standards/weather/stat_file.rb +13 -4
  26. metadata +9 -3
  27. data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +0 -86
@@ -184888,10 +184888,33 @@
184888
184888
  "day_types": "Default|Hol",
184889
184889
  "start_date": "2014-01-01T00:00:00+00:00",
184890
184890
  "end_date": "2014-12-31T00:00:00+00:00",
184891
- "type": "Constant",
184891
+ "type": "Hourly",
184892
184892
  "notes": "From eQ_Lib.dat in MASControl 2017",
184893
184893
  "values": [
184894
- 0.5
184894
+ 0.0,
184895
+ 0.0,
184896
+ 0.0,
184897
+ 0.0,
184898
+ 0.0,
184899
+ 0.0,
184900
+ 0.02,
184901
+ 0.04,
184902
+ 0.12,
184903
+ 0.28,
184904
+ 0.44,
184905
+ 0.45,
184906
+ 0.49,
184907
+ 0.52,
184908
+ 0.55,
184909
+ 0.55,
184910
+ 0.55,
184911
+ 0.55,
184912
+ 0.54,
184913
+ 0.32,
184914
+ 0.2,
184915
+ 0.02,
184916
+ 0.0,
184917
+ 0.0
184895
184918
  ]
184896
184919
  },
184897
184920
  {
@@ -185538,26 +185561,27 @@
185538
185561
  0.0,
185539
185562
  0.0,
185540
185563
  0.0,
185541
- 0.0,
185542
- 0.02,
185543
- 0.04,
185544
- 0.12,
185545
- 0.28,
185546
- 0.44,
185547
- 0.45,
185548
- 0.49,
185549
- 0.52,
185564
+ 0.05,
185565
+ 0.10,
185566
+ 0.15,
185567
+ 0.25,
185568
+ 0.40,
185550
185569
  0.55,
185551
- 0.6,
185552
- 0.7,
185553
- 0.68,
185554
- 0.54,
185555
- 0.32,
185556
- 0.2,
185557
- 0.02,
185558
- 0.0,
185570
+ 0.65,
185571
+ 0.70,
185572
+ 0.65,
185573
+ 0.60,
185574
+ 0.58,
185575
+ 0.70,
185576
+ 0.85,
185577
+ 0.90,
185578
+ 0.75,
185579
+ 0.55,
185580
+ 0.35,
185581
+ 0.10,
185559
185582
  0.0
185560
185583
  ]
185584
+
185561
185585
  },
185562
185586
  {
185563
185587
  "name": "D_Gro_Sales_Occup_Yr",
@@ -344081,10 +344105,14 @@
344081
344105
  0.05,
344082
344106
  0.05,
344083
344107
  0.05,
344084
- 0.05,
344085
- 0.2,
344086
- 0.2,
344087
- 0.5,
344108
+ 0.6,
344109
+ 0.9,
344110
+ 0.9,
344111
+ 0.9,
344112
+ 0.9,
344113
+ 0.9,
344114
+ 0.9,
344115
+ 0.9,
344088
344116
  0.9,
344089
344117
  0.9,
344090
344118
  0.9,
@@ -344095,10 +344123,6 @@
344095
344123
  0.9,
344096
344124
  0.9,
344097
344125
  0.6,
344098
- 0.6,
344099
- 0.5,
344100
- 0.2,
344101
- 0.05,
344102
344126
  0.05
344103
344127
  ]
344104
344128
  },
@@ -344117,10 +344141,6 @@
344117
344141
  0.05,
344118
344142
  0.05,
344119
344143
  0.05,
344120
- 0.05,
344121
- 0.1,
344122
- 0.1,
344123
- 0.3,
344124
344144
  0.6,
344125
344145
  0.9,
344126
344146
  0.9,
@@ -344130,11 +344150,15 @@
344130
344150
  0.9,
344131
344151
  0.9,
344132
344152
  0.9,
344133
- 0.5,
344134
- 0.3,
344135
- 0.3,
344136
- 0.1,
344137
- 0.05,
344153
+ 0.9,
344154
+ 0.9,
344155
+ 0.9,
344156
+ 0.9,
344157
+ 0.9,
344158
+ 0.9,
344159
+ 0.9,
344160
+ 0.9,
344161
+ 0.6,
344138
344162
  0.05
344139
344163
  ]
344140
344164
  },
@@ -344166,24 +344190,24 @@
344166
344190
  0.05,
344167
344191
  0.05,
344168
344192
  0.05,
344169
- 0.05,
344170
- 0.1,
344171
- 0.1,
344172
- 0.1,
344173
- 0.1,
344174
- 0.4,
344175
- 0.4,
344176
- 0.6,
344177
- 0.6,
344178
- 0.6,
344179
344193
  0.6,
344194
+ 0.9,
344195
+ 0.9,
344196
+ 0.9,
344197
+ 0.9,
344198
+ 0.9,
344199
+ 0.9,
344200
+ 0.9,
344201
+ 0.9,
344202
+ 0.9,
344203
+ 0.9,
344204
+ 0.9,
344205
+ 0.9,
344206
+ 0.9,
344207
+ 0.9,
344208
+ 0.9,
344209
+ 0.9,
344180
344210
  0.6,
344181
- 0.4,
344182
- 0.2,
344183
- 0.2,
344184
- 0.2,
344185
- 0.2,
344186
- 0.05,
344187
344211
  0.05
344188
344212
  ]
344189
344213
  },
@@ -344215,24 +344239,24 @@
344215
344239
  0.0,
344216
344240
  0.0,
344217
344241
  0.0,
344218
- 0.0,
344219
- 0.1,
344220
- 0.1,
344221
- 0.2,
344222
- 0.5,
344223
- 0.5,
344224
- 0.7,
344225
- 0.7,
344226
- 0.7,
344227
- 0.7,
344228
- 0.8,
344229
- 0.7,
344230
- 0.5,
344231
- 0.5,
344232
- 0.3,
344233
- 0.3,
344234
- 0.3,
344235
- 0.0,
344242
+ 0.05,
344243
+ 0.10,
344244
+ 0.15,
344245
+ 0.25,
344246
+ 0.40,
344247
+ 0.55,
344248
+ 0.65,
344249
+ 0.70,
344250
+ 0.65,
344251
+ 0.60,
344252
+ 0.58,
344253
+ 0.70,
344254
+ 0.85,
344255
+ 0.90,
344256
+ 0.75,
344257
+ 0.55,
344258
+ 0.35,
344259
+ 0.10,
344236
344260
  0.0
344237
344261
  ]
344238
344262
  },
@@ -344251,24 +344275,24 @@
344251
344275
  0.0,
344252
344276
  0.0,
344253
344277
  0.0,
344254
- 0.0,
344255
- 0.1,
344256
- 0.1,
344257
- 0.2,
344258
- 0.5,
344259
- 0.6,
344260
- 0.8,
344261
- 0.8,
344262
- 0.8,
344263
- 0.8,
344264
- 0.8,
344265
- 0.8,
344266
- 0.6,
344267
- 0.2,
344268
- 0.2,
344269
- 0.2,
344270
- 0.1,
344271
- 0.0,
344278
+ 0.03,
344279
+ 0.08,
344280
+ 0.20,
344281
+ 0.35,
344282
+ 0.55,
344283
+ 0.70,
344284
+ 0.80,
344285
+ 0.85,
344286
+ 0.85,
344287
+ 0.80,
344288
+ 0.75,
344289
+ 0.70,
344290
+ 0.65,
344291
+ 0.55,
344292
+ 0.40,
344293
+ 0.25,
344294
+ 0.10,
344295
+ 0.02,
344272
344296
  0.0
344273
344297
  ]
344274
344298
  },
@@ -344300,23 +344324,23 @@
344300
344324
  0.0,
344301
344325
  0.0,
344302
344326
  0.0,
344303
- 0.0,
344304
- 0.1,
344305
- 0.1,
344306
- 0.1,
344307
- 0.1,
344308
- 0.2,
344309
- 0.2,
344310
- 0.4,
344311
- 0.4,
344312
- 0.4,
344313
- 0.4,
344314
- 0.4,
344315
- 0.2,
344316
- 0.1,
344317
- 0.1,
344318
- 0.1,
344319
- 0.1,
344327
+ 0.02,
344328
+ 0.06,
344329
+ 0.15,
344330
+ 0.30,
344331
+ 0.50,
344332
+ 0.65,
344333
+ 0.75,
344334
+ 0.80,
344335
+ 0.75,
344336
+ 0.65,
344337
+ 0.55,
344338
+ 0.45,
344339
+ 0.35,
344340
+ 0.25,
344341
+ 0.15,
344342
+ 0.05,
344343
+ 0.01,
344320
344344
  0.0,
344321
344345
  0.0
344322
344346
  ]
@@ -344921,7 +344945,7 @@
344921
344945
  0.0,
344922
344946
  0.0,
344923
344947
  0.0,
344924
- 0.0,
344948
+ 1.0,
344925
344949
  1.0,
344926
344950
  1.0,
344927
344951
  1.0,
@@ -345251,7 +345275,7 @@
345251
345275
  0.0,
345252
345276
  0.0,
345253
345277
  0.0,
345254
- 0.0,
345278
+ 1.0,
345255
345279
  1.0,
345256
345280
  1.0,
345257
345281
  1.0,
@@ -65599,7 +65599,7 @@
65599
65599
  0.3,
65600
65600
  0.3,
65601
65601
  0.3,
65602
- 0.3,
65602
+ 0.7,
65603
65603
  0.7,
65604
65604
  0.7,
65605
65605
  0.7,
@@ -185845,12 +185845,12 @@
185845
185845
  0.75,
185846
185846
  0.75,
185847
185847
  0.75,
185848
- 0.5,
185849
- 0.5,
185850
- 0.5,
185851
- 0.5,
185852
- 0.5,
185853
- 0.5
185848
+ 0.75,
185849
+ 0.75,
185850
+ 0.75,
185851
+ 0.75,
185852
+ 0.75,
185853
+ 0.75
185854
185854
  ]
185855
185855
  },
185856
185856
  {
@@ -185894,24 +185894,24 @@
185894
185894
  0.0,
185895
185895
  0.0,
185896
185896
  0.0,
185897
- 0.0,
185898
- 0.02,
185899
- 0.04,
185900
- 0.12,
185901
- 0.28,
185902
- 0.44,
185903
- 0.45,
185904
- 0.49,
185905
- 0.52,
185897
+ 0.05,
185898
+ 0.10,
185899
+ 0.15,
185900
+ 0.25,
185901
+ 0.40,
185906
185902
  0.55,
185907
- 0.6,
185908
- 0.7,
185909
- 0.68,
185910
- 0.54,
185911
- 0.32,
185912
- 0.2,
185913
- 0.02,
185914
- 0.0,
185903
+ 0.65,
185904
+ 0.70,
185905
+ 0.65,
185906
+ 0.60,
185907
+ 0.58,
185908
+ 0.70,
185909
+ 0.85,
185910
+ 0.90,
185911
+ 0.75,
185912
+ 0.55,
185913
+ 0.35,
185914
+ 0.10,
185915
185915
  0.0
185916
185916
  ]
185917
185917
  },
@@ -170,7 +170,6 @@ module OpenStudioStandards
170
170
  # Count the number of lines of a idf object and return the last index
171
171
  # (e.g. find the index of "!- Fan Inlet Node Name")
172
172
  # @param idf_object
173
- # @param search_string str
174
173
  # @return index if found
175
174
  def self.find_last_index_of_idf_object(idf_object)
176
175
  split_object = idf_object.to_s.split("\n")
@@ -182,7 +181,7 @@ module OpenStudioStandards
182
181
  # If the index is not found, this function returns the last index of the object + 1
183
182
  # (e.g. find the index of "!- Fan Inlet Node Name")
184
183
  # @param idf_object
185
- # @param search_string str
184
+ # @param search_string [String]
186
185
  # @return index if found
187
186
  def self.find_index_of_string(idf_object, search_string)
188
187
 
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.8.0'.freeze
16
+ VERSION = '0.8.1'.freeze
17
17
  end
@@ -212,7 +212,7 @@ module OpenstudioStandards
212
212
 
213
213
  # check info size
214
214
  if match_info_raw.size != temp_info[:size]
215
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Weather.StatFile', "Expected to find #{temp_info[:size]} #{temp_info[:name]} but found #{match_info_raw.size}. Check data source.")
215
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Weather.StatFile', "Expected to find #{temp_info[:size]} #{temp_info[:name]} but found #{match_info_raw.size}. Check data source.")
216
216
  end
217
217
 
218
218
  match_info_raw.each do |val|
@@ -284,13 +284,20 @@ module OpenstudioStandards
284
284
  degree_day_info.each { |dd_info| parse_dd_info(dd_info) }
285
285
 
286
286
  # parse design temperatures
287
+ # TMYx stat file format is different than TMY3, cf #1948
288
+ is_tmyx = @text.include?("Wind Shelter Factor")
287
289
  temperature_info = [
288
- { name: 'Heating Design Temperatures', regex: /Heating(\s*\d+.*)\n/, container: @heating_design_info, size: 15 },
290
+ { name: 'Heating Design Temperatures', regex: /Heating(\s*\d+.*)\n/, container: @heating_design_info, size: is_tmyx ? 16 : 15 },
289
291
  { name: 'Cooling Design Temperatures', regex: /Cooling(\s*\d+.*)\n/, container: @cooling_design_info, size: 32 },
290
- { name: 'Extreme Design Temperatures', regex: /\s*Extremes\s*(.*)\n/, container: @extremes_design_info, size: 16 },
292
+ { name: 'Extreme Design Temperatures', regex: /\s*Extremes\s*(.*)\n/, container: @extremes_design_info, size: is_tmyx ? 15 : 16 },
291
293
  { name: 'Monthly Dry Bulb Temperatures', regex: /Daily Avg(.*)\n/, container: @monthly_dry_bulb, size: 12 }
292
294
  ]
293
295
  temperature_info.each { |temp_info| parse_design_temp_info(temp_info) }
296
+ if is_tmyx
297
+ @heating_design_info.pop() # remove the last value, which is the Wind Shelter Factor
298
+ # There is no WBmax in TMYx files, so add a nil
299
+ @extremes_design_info.insert(3, nil)
300
+ end
294
301
 
295
302
  # parse undisturbed ground temps at 0.5 and 4.0 m depth
296
303
  regex = /Monthly.*Calculated.*undisturbed*.*Ground.*Temperatures.*\n.*Jan.*Feb.*Mar.*Apr.*May.*Jun.*Jul.*Aug.*Sep.*Oct.*Nov.*Dec.*\n(.*)\n(.*)\n(.*)/
@@ -342,7 +349,9 @@ module OpenstudioStandards
342
349
  # week periods
343
350
  regex = /Typical Week Period selected:(.*?)C/
344
351
  match_data = @text.scan(regex)
345
- if match_data.nil? || match_data.empty?
352
+ if @text.include?('No discernible dry period')
353
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Weather.stat_file', "Can't find typical weather weeks in the .stat file because it has no discernible dry period .")
354
+ elsif match_data.nil? || match_data.size < 2
346
355
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Weather.stat_file', "Can't find typical weather weeks in the .stat file.")
347
356
  else
348
357
  @typical_summer_wet_week = Date.parse("#{match_data[0][0].split(':')[0]} 2000")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Adams
@@ -39,7 +39,7 @@ authors:
39
39
  autorequire:
40
40
  bindir: bin
41
41
  cert_chain: []
42
- date: 2025-06-05 00:00:00.000000000 Z
42
+ date: 2025-06-14 00:00:00.000000000 Z
43
43
  dependencies:
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: bundler
@@ -859,8 +859,12 @@ files:
859
859
  - lib/openstudio-standards/create_typical/space_type_ratios.rb
860
860
  - lib/openstudio-standards/daylighting/space.rb
861
861
  - lib/openstudio-standards/exterior_lighting/create.rb
862
+ - lib/openstudio-standards/exterior_lighting/data/convert_entryway_data.rb
863
+ - lib/openstudio-standards/exterior_lighting/data/convert_parking_data.rb
862
864
  - lib/openstudio-standards/exterior_lighting/data/entryways.csv
865
+ - lib/openstudio-standards/exterior_lighting/data/entryways.json
863
866
  - lib/openstudio-standards/exterior_lighting/data/parking.csv
867
+ - lib/openstudio-standards/exterior_lighting/data/parking.json
864
868
  - lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json
865
869
  - lib/openstudio-standards/exterior_lighting/information.rb
866
870
  - lib/openstudio-standards/geometry/create.rb
@@ -874,11 +878,13 @@ files:
874
878
  - lib/openstudio-standards/hvac/components/create.rb
875
879
  - lib/openstudio-standards/hvac/components/modify.rb
876
880
  - lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb
877
- - lib/openstudio-standards/hvac/exhaust/data/convert_data.rb
881
+ - lib/openstudio-standards/hvac/exhaust/data/convert_typical_exhaust_data.rb
878
882
  - lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.csv
879
883
  - lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.json
880
884
  - lib/openstudio-standards/hvac/setpoint_managers/information.rb
881
885
  - lib/openstudio-standards/infiltration/data/NISTInfiltrationCorrelations.csv
886
+ - lib/openstudio-standards/infiltration/data/NISTInfiltrationCorrelations.json
887
+ - lib/openstudio-standards/infiltration/data/convert_infiltration_data.rb
882
888
  - lib/openstudio-standards/infiltration/infiltration.rb
883
889
  - lib/openstudio-standards/infiltration/nist_infiltration.rb
884
890
  - lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb
@@ -1,86 +0,0 @@
1
- # These methods convert space type service water heating equipment data to and from .csv for editing.
2
- private
3
-
4
- require 'csv'
5
- require 'json'
6
-
7
- # Typical Water Use Equipment Data Schema
8
- # equipment_name: The name of the specific piece of equipment. The space name will be prepended, and flow rate and temperature appended to the name.
9
- # peak_flow_rate: The peak flow rate in gallons per hour
10
- # peak_flow_rate_per_area: The peak flow rate in gallons per hour per ft^2 of floor area. Only used if 'peak_flow_rate' is unspecified.
11
- # loop_type: Several options are available.
12
- # - 'One Per Space': This water use equipment uses a dedicated loop in each space.
13
- # - 'One Per Unit': This water use equipment uses a dedicated loop in each space. Water use equipment flow rates are multiplied by the 'num_units' additional property on the Space object.
14
- # - 'Shared': Equipment will use the shared building service hot water loop.
15
- # - 'One Per Space Type Adjacent': Not yet supported. Will create a dedicated loop to serve all adjacent equipment of the same space type.
16
- # - 'One Per Building Type Adjacent': Not yet supported. Will create a dedicated loop to serve all adjacent equipment of the same building type.
17
- # temperature: Target mixed water temperature at the water use, in degrees Fahrenheit
18
- # flow_rate_schedule: The name of the flow rate schedule from the schedules .json
19
- # sensible_fraction: The fraction of heat content converted to space sensible load
20
- # latent_fraction: The fraction of heat content converted to space latent load
21
-
22
- # Future Schema inclusions?
23
- # minimum_space_size: Not yet supported. Only add this water use if the space is above this size of floor area.
24
- # minimum_tank_volume: Not yet supported. The minimum tank volume to use for dedicated loops. The default is 40 gallons.
25
-
26
- def csv_to_json(input_csv = 'typical_exhaust.csv',
27
- output_json = 'typical_exhaust.json')
28
- # Initialize the structure
29
- result = {
30
- space_types: []
31
- }
32
-
33
- # Read the CSV file
34
- CSV.foreach(input_csv, headers: true, header_converters: :symbol) do |row|
35
- space_type = row[:space_type]
36
- building_type = row[:building_type]
37
- exhaust_per_area = row[:exhaust_per_area]
38
-
39
- space_type_hash = {
40
- space_type: space_type,
41
- building_type: building_type,
42
- exhaust_per_area: exhaust_per_area
43
- }
44
-
45
- # Add the space_type_hash to the result array
46
- result[:space_types] << space_type_hash
47
- end
48
-
49
- # Write to the output JSON file
50
- File.write(output_json, JSON.pretty_generate(result))
51
-
52
- puts "Data has been converted to JSON and saved to #{output_json}"
53
- end
54
-
55
- # convert to json
56
- csv_to_json
57
-
58
- def json_to_csv(input_json = 'typical_exhaust.json',
59
- output_csv = 'typical_exhaust.csv')
60
- # Read the JSON file
61
- data = JSON.parse(File.read(input_json), symbolize_names: true)
62
-
63
- # Prepare the CSV headers
64
- headers = [
65
- :space_type,
66
- :building_type,
67
- :exhaust_per_area
68
- ]
69
-
70
- # Write the CSV file
71
- CSV.open(output_csv, 'w', write_headers: true, headers: headers) do |csv|
72
- data[:space_types].each do |space_type_entry|
73
- space_type = space_type_entry[:space_type]
74
- building_type = space_type_entry[:building_type]
75
- exhaust_per_area = space_type_entry[:exhaust_per_area]
76
-
77
- csv << [
78
- space_type,
79
- building_type,
80
- exhaust_per_area
81
- ]
82
- end
83
- end
84
-
85
- puts "Data has been converted to CSV and saved to #{output_csv}"
86
- end