Since each entry has a dynamic numbers of rows, I first determine the start and end point of each group. I look for it a row that contains ##TITLE, assuming that this marks a new entry, with using
Using the rowIndex() as identifier ensures that it’s always unique. With a Missing Value node you can supplement this group designator to ensure completeness.
The main issue here is that you have rows that do not start with ##, specifically for ##XYDATA. Based on your sample I had to assume that this is the only case. So what I did is; when Arr[1] is null, replace it with the value of Arr[0], under the same condition make Arr[0] and replace it with the last known column name and group the xydata coordinates.
That can be done quicker by adding the column name to each field with a seperator, creating a list of each row, ungroup it and then split the fields again. But its feasibility really depends on how dynamic the columns are. If you always expect these column names than it should be doable.