www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to split a string to a 2D array

reply Domain <dont_email empty.com> writes:
I want to convert a string like " a,b<br/>1, 2<br/>3<br/> " to a 
2D array like:
[["a", "b"],
  ["1", "2"],
  ["3", "" ]]


auto html = " a,b<br/>1, 2<br/>3<br/> ";
auto rows = html.strip.chomp("<br/>").split("<br/>");
string[][] data;
rows.each!(a => data ~= a.split(","));
string[][] result = data.map!(a => a.padRight("", 
data[0].length).map!(b => b.strip)).array;

but the result is not a string[][]:

Error: cannot implicitly convert expression `array(map(data))` of 
type `MapResult!(__lambda2, Result)[]` to `string[][]`
Feb 23 2018
parent reply Domain <dont_email empty.com> writes:
On Saturday, 24 February 2018 at 07:51:27 UTC, Domain wrote:
 I want to convert a string like " a,b<br/>1, 2<br/>3<br/> " to 
 a 2D array like:
 [["a", "b"],
  ["1", "2"],
  ["3", "" ]]


 auto html = " a,b<br/>1, 2<br/>3<br/> ";
 auto rows = html.strip.chomp("<br/>").split("<br/>");
 string[][] data;
 rows.each!(a => data ~= a.split(","));
 string[][] result = data.map!(a => a.padRight("", 
 data[0].length).map!(b => b.strip)).array;

 but the result is not a string[][]:

 Error: cannot implicitly convert expression `array(map(data))` 
 of type `MapResult!(__lambda2, Result)[]` to `string[][]`
And why this not compile: rows.each!(a => data ~= a.split(",").map!(b => b.strip).padRight("", 2)); Error: cannot deduce function from argument types !()(string[]), candidates are: C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(899): C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(934):
Feb 24 2018
parent reply Domain <dont_email empty.com> writes:
On Saturday, 24 February 2018 at 08:59:46 UTC, Domain wrote:
 On Saturday, 24 February 2018 at 07:51:27 UTC, Domain wrote:
 [...]
And why this not compile: rows.each!(a => data ~= a.split(",").map!(b => b.strip).padRight("", 2)); Error: cannot deduce function from argument types !()(string[]), candidates are: C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(899): C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(934):
OK, this compile: rows.each!(a => data ~= a.split(",").map!(b => b.strip).padRight("", 2).array);
Feb 24 2018
parent Seb <seb wilzba.ch> writes:
On Saturday, 24 February 2018 at 09:06:09 UTC, Domain wrote:
 On Saturday, 24 February 2018 at 08:59:46 UTC, Domain wrote:
 On Saturday, 24 February 2018 at 07:51:27 UTC, Domain wrote:
 [...]
And why this not compile: rows.each!(a => data ~= a.split(",").map!(b => b.strip).padRight("", 2)); Error: cannot deduce function from argument types !()(string[]), candidates are: C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(899): C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm\iteration.d(934):
OK, this compile: rows.each!(a => data ~= a.split(",").map!(b => b.strip).padRight("", 2).array);
FYI: Idiomatic D would be to avoid allocations (faster!). An example: ``` auto html = " a,b<br/>1, 2<br/>3<br/> "; auto rows = html.strip.splitter("<br/>").filter!(not!empty).map!(a => a.splitter(",")); rows.writeln; ``` https://run.dlang.io/is/LC7Sog If you really, really need a 2d array you can always do so if required at the end: ``` auto arr2d = rows.map!array.array; ``` But please keep in mind that you ideally avoid the allocations in the first place.
Feb 24 2018