Solved

Split before second break tag?

Posted on 2003-10-26
31
228 Views
Last Modified: 2010-03-05
I have a value called: $r_rowdata->{'Description'}.
$r_rowdata->{'Description'} = "this is<br>a test for doing<br>a break bla<br>bla.

What I want to do is write only the part till the second break (<br>).
"this is<br>a test for doing".

How to do that?

XML uses not <br> but <br/> or <br />
so the value would be:
$r_rowdata->{'Description'} = "this is<br/>a test for doing<br/>a break bla<br/>bla.
or:
$r_rowdata->{'Description'} = "this is<br />a test for doing<br />a break bla<br />bla.
or even all together:
$r_rowdata->{'Description'} = "this is<br>a test for doing<br />a break bla<br/>bla.

How to get one solution for all possible options telling at the beginning what sort of break tag
has to be used in the result:
option: break = <br>.
"this is<br>a test for doing" or
option: break = <br />.
"this is<br />a test for doing" or
option: break = <br/>.
"this is<br/>a test for doing".

Would be nice if the place to split the value at what break would also be an option?
At the second break = 2
At the third break = 3 etc

option: break = <br> and break number = 2.
"this is<br>a test for doing" or
option: break = <br /> and break number = 3.
"this is<br />a test for doing<br />a break bla" or
option: break = <br/> and break number = 1.
"this is".
0
Comment
Question by:mmcw
  • 11
  • 10
  • 8
  • +1
31 Comments
 
LVL 8

Expert Comment

by:inq123
Comment Utility
one of the more efficient regex (and more correct of course :-) ) would be below (vary $n from 2-6 and verify the correctness):

my $test = "this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  print $& . "\n";
}

If you don't care about splitting everything but only care about the first one, then prematch string could be of use and no while loop is needed.
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
oops I mean 2-5, my $test only has 5 <br>
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
Here's three regex's that will split the line as you asked.  With tese regex's you should be able to build a case statement to choose the break point.

$r_rowdata->{'Description'} = "this is<br/>a test for doing<br />a break bla<br/>bla.";

print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/);
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
Here's how you can build the case block.

use Switch;

$r_rowdata->{'Description'} = "this is<br>a test for doing<br />a break bla<br/>bla.";

print "What's the break point: ";
chomp ($break = <STDIN>);

switch ($break) {
   case 1 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/)}
   case 2 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/)}
   case 3 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/)}
   else     {print "Break point is out of range"}
}
0
 

Author Comment

by:mmcw
Comment Utility
inq123:

It does return the whole line???
When I set $n to 2 does it mean the it has to return till the second break tag?

I tried this:

my $test = "this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  print $& . "\n";
}      

But it will print:

this is<br>
a test for doing<br />
a break bla<br/>
bla<br>
abc<br/>

It has only to print:

this is<br>a test for doing

FishMonger:

I tried yours but without success.
I think the switch module is not installed!!
I get errors!!

Can you help me to a working example without the switch command?

use Switch;

$r_rowdata->{'Description'} = "this is<br>a test for doing<br />a break bla<br/>bla.";

print "What's the break point: ";
chomp ($break = <STDIN>);

switch ($break) {
   case 1 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/)}
   case 2 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/)}
   case 3 {print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/)}
   else     {print "Break point is out of range"}
}
0
 

Author Comment

by:mmcw
Comment Utility
FishMonger:


$r_rowdata->{'Description'} = "this is<br>a test for doing<br />a break bla<br/>bla.";
print header();
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/);

Does not print anything??
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
mmcw,  It should have printed; here's what I tested and its results.

C:\testing>type mmcw.pl
#!perl -w

$r_rowdata->{'Description'} = "this is<br>a test for doing<br />a break bla<br/>bla.";
#print header();
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/);
print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/);

C:\testing>mmcw.pl
this is
this is<br>a test for doing
this is<br>a test for doing<br />a break bla
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
Once you get it to print, then you can use a nested if block to select and print the one you want. Maybe something like this:


chomp ($break = <SDTIN>);

if ($break == 3) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/);
}
elsif ($break == 2) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/);
}
elsif ($break == 1) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/);
}
else {print "unknown break point\n"}
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
========================
my $test = "this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  print $& . "\n";
}    

But it will print:

this is<br>
a test for doing<br />
a break bla<br/>
bla<br>
abc<br/>

=======================================

Are you sure?  What Perl version are you using, on which platform?  Before I gave you this solution, I had tried and everything was working fine.  My code doesn't get rid of the last <br> though, so the output for n=2 is:

this is<br>a test for doing<br />
a break bla<br/>bla<br>

In my test there was no way that my program return what you saw (and I even copied the code you pasted in and tested again on both MSWindows XP + activestate 5.8.0 and Linux + 5.6.1).  It's not possible to see the return that you saw even if I changed my code to this:
my $test = "this is<br>
a test for doing<br />
a break bla<br/>
bla<br>
abc<br/>
def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  print $& . "\n";
}
(the above would print
this is<br>
a test for doing<br />

a break bla<br/>
bla<br>
for both MSW and Linux.  Are you sure you copied my code correctly?  As for the trailing<br> problem, I modified my code a little to get rid of it, see below:

my $test = "this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  my $tmp = $&;
  $tmp =~ s/<\s*br\s*\/?\s*>$//;
  print "$tmp\n";
}

which would output (as I tested):
this is<br>a test for doing
a break bla<br/>bla

IMO FishMonger's multiple regex solution definitely is not the way to go as you need to expand the code as you expand n.

f
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
inq123,  I think you need to re-read mmcw's output requirements.  At least my solution produces the desired output; yours doesn't.
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
FishMonger, sorry if I offended you by offering an honest, non-bashing opinion on your code.  Indeed I forgot to get rid of the <br/> at end in my first version, but if you had read my post, my last post had fixed this problem.  So there's really no need to "retaliate" by naming some bug that my script doesn't have now.  It's not an appropriate thing to do.

BTW, mmcw did mention "Would be nice if the place to split the value at what break would also be an option?
At the second break = 2
At the third break = 3 etc" which means he/she would want to potentially expand $n to any arbitrary number, thus I had the comment on your code.  Feel free to correct me if I'm wrong in interpreting mmcw's requirement and assessment of your code in lieu of this particular requirement.

PS, I would encourage you to test my code.  I would like to see why mmcw got incorrect output and see if others can reproduce it.  If you find any real bug in my code, I'm glad to hear it.  Thanks.
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
inq123, I wasn't offended and I didn't mean to "bash" you; I was just stating a fact.  I'm currently at work and I'm unable to do any testing, but according to your stated output even this latest version of yours doesn't produce the desired output.  You've stated that this last version produces:

which would output (as I tested):
this is<br>a test for doing
a break bla<br/>bla

but from my reading of the output requirements that mmcw wants, it should be:

this is
this is<br>a test for doing
this is<br>a test for doing<br />a break bla

Earlier, I did run a test on your prior version that mmcw had the problem with, and if $n = 1 then the output would be as mmcw stated.  So, I think there was an error when he/she copied/pasted the script in the post.

I do agree that using one regex would be best.  Can I suggest that we combine our effort to come up with the best solution instead of misinterpreting each other’s intentions?
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
great, I have no objection to that.  But I do realize that we have different interpretation of mmcw's requirement, and we would need him to clear it up for us.  From your interpretation, mmcw wants

this is
this is<br>a test for doing
this is<br>a test for doing<br />a break bla

produced in the same output for a string like this is<br>a test for doing<br />a break bla<br/>, but I think mmcw meant that he/she wants

"this is" produced when $n = 1
"this is<br>a test for doing" produced when $n = 2
"this is<br>a test for doing<br />a break bla" when $n = 3

I thought so because mmcw's comment in OP:
"What I want to do is write only the part till the second break (<br>).
"this is<br>a test for doing"." -- this means mmcw just want one string output for one program run at $n = 2
And this paragraph shows that
"Would be nice if the place to split the value at what break would also be an option?
At the second break = 2
At the third break = 3 etc

option: break = <br> and break number = 2.
"this is<br>a test for doing" or
option: break = <br /> and break number = 3.
"this is<br />a test for doing<br />a break bla" or
option: break = <br/> and break number = 1.
"this is"."
I think by this paragraph mmcw meant that for $n = anything, only one string needs to be produced, so based on $n = 1 .. 3, the output would be:

this is
this is<br>a test for doing
this is<br>a test for doing<br />a break bla

I think that's why you misunderstood.  Or is it me? :-)  BTW, if it's me, then we should modify regex and print prematch instead, and we still only need one regex.

Anyway as I also said earlier, if mmcw wants just one string, then don't use while loop in my program (and get rid of /g in the regex), or use a "last" in while loop.  I think if we can work out why mmcw couldn't get my program to work or yours, then the problem would be solved.  What do you think?
0
 

Author Comment

by:mmcw
Comment Utility
FishMonger:

A night sleep got me your example to work. However when there are some ohter tags in the input ($r_rowdata->{'Description'}) line it doesn't work!

#!/usr/bin/perl -w

$r_rowdata->{'Description'} = "<b>this</b> is<br />a test for doing<br />a break bla<br />bla.";

my $break = 2;

print "Content-Type: text/html\015\012\015\012";

if ($break == 3) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?>[^<]+<br[\s\/]?[^<]+)/);
}
elsif ($break == 2) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+<br[\s\/]?[^<]+)/);
}
elsif ($break == 1) {
   print "$1\n" if ($r_rowdata->{'Description'} =~ /^([^<]+)<br/);
}
else {print "unknown break point\n"}

1;
0
 

Author Comment

by:mmcw
Comment Utility
inq123:

I got your example to work also:
When the $break option = 2 I want as result: "<b>this</b> is<br />a test for doing".
You example solves the splitting part as I want when I add the last command but it also removes other html tags? The other HTML tags have to stay.

#!/usr/bin/perl -w

$r_rowdata->{'Description'} = "<b>this</b> is<br />a test for doing<br />a break bla<br />bla.";

my $break = 2;

print "Content-Type: text/html\015\012\015\012";

my $test = "this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";
my $n = 2;
while($test =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/gis)
{
  my $tmp = $&;
  $tmp =~ s/<\s*br\s*\/?\s*>$//;
  print "$tmp\n";

  last;
}

1;
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:mmcw
Comment Utility
inq123:

Sorry your example did work. But how to remove the while loop?

#!/usr/bin/perl -w

$r_rowdata->{'Description'} = "<b>this</b> is<br />a test for doing<br />a break bla<br />bla.";

my $break = 2;

print "Content-Type: text/html\015\012\015\012";

my $n = 2;
while($r_rowdata->{'Description'} =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/is)
{
  my $tmp = $&;
  $tmp =~ s/<\s*br\s*\/?\s*>$//;
  print "$tmp\n";

  last;
}

1;
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
I think we both agree with the interpretation.  My error was that I missed that it needed to be n times; I thought it only needed to be 3 which the switch or if block would accomplish that and print just the one line.  I haven't tested your script with the last modification that you mentioned; hopefully that will solve the problem.  I'll look at it in the morning to see if there is anything that I can/need/should give imput on.
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
I think this should do what you want.  It's a modification of my original regex but also incorporates the best part of inq123's regex.  The loop isn't needed; I just put it into the loop to demestrate what would get printed as $n increases.


$r_rowdata->{'Description'} = "<br/>this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";

for $n (1..5) {
   print "$&\n" if($r_rowdata->{'Description'} =~ /^((<\s*br[\s\/]*>)?[^<]+){$n}/i);
}


--outputs--
<br/>this is
<br/>this is<br>a test for doing
<br/>this is<br>a test for doing<br />a break bla
<br/>this is<br>a test for doing<br />a break bla<br/>bla
<br/>this is<br>a test for doing<br />a break bla<br/>bla<br>abc
0
 

Author Comment

by:mmcw
Comment Utility
FishMonger:

Looks nice but when in the $r_rowdata->{'Description'} is a Bold tag - I thank an other HTML tag - nothing will be returned! In my example only end will be returned! It has to be possible taht other HTML tags are included in $r_rowdata->{'Description'}!
What s wrong or what am I doing wrong?

#!/usr/bin/perl -w

print "Content-Type: text/html\015\012\015\012";

$r_rowdata->{'Description'} = "<b>this</b> is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";

for $n (1..5) {
   print "$&\n" if($r_rowdata->{'Description'} =~ /^((<\s*br[\s\/]*>)?[^<]+){$n}/i);
}


print "end<br>";

1;
0
 
LVL 8

Accepted Solution

by:
inq123 earned 50 total points
Comment Utility
mmcw, I think Fishmonger already demonstrated how to get rid of while loop in my code, his regex is an improvement on mine with one exception: it's splitting one <br> later than it should (that's actually why I was not able to procude one regex and not have a <br> at end of string, otherwise I would've used a regex like fishmonger's).  I mean, at least from mmcw's orginal requirement it seems:

$r_rowdata->{'Description'} = "<br/>this is<br>a test for doing<br />a break bla<br/>bla<br>abc<br/>def";

for $n (1..5) {
   print "$&\n" if($r_rowdata->{'Description'} =~ /^((<\s*br[\s\/]*>)?[^<]+){$n}/i);
}

should produce:
'' # empty string when $n = 1
<br/>this is # $n = 2
<br/>this is<br>a test for doing # $n = 3
<br/>this is<br>a test for doing<br />a break bla # $n = 4
<br/>this is<br>a test for doing<br />a break bla<br/>bla # $n = 5

Therefore I think we still need to use my last version of code with while loop removed:

#!/usr/bin/perl -w

$r_rowdata->{'Description'} = "<b>this</b> is<br />a test for doing<br />a break bla<br />bla.";

my $break = 2;

print "Content-Type: text/html\015\012\015\012";

my $n = 3;
$r_rowdata->{'Description'} =~ /(?:.*?<\s*br\s*\/?\s*>){$n}/is;
my $tmp = $&;
$tmp =~ s/<\s*br\s*\/?\s*>$//;
print "$tmp\n";

BTW, you don't need to have 1; at end unless your script is a module, which is probably not the case.
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
BTW, I just realized that FishMonger's last regex has a little mistake that can't be fixed unless you use a two regex approach like mine.  Here's a new test string that breaks his script:

#!/usr/bin/perl -w

$r_rowdata->{'Description'} = "<br/>this is<br>a test for doing<b>new test</b><br />a break bla<br/>bla<br>abc<br/>def";

for $n (1..5) {
   print "$&\n" if($r_rowdata->{'Description'} =~ /^((<\s*br[\s\/]*>)?[^<]+){$n}/i);
}

would produce:

<br/>this is
<br/>this is<br>a test for doing
<br/>this is<br>a test for doing
<br/>this is<br>a test for doing
<br/>this is<br>a test for doing
0
 

Author Comment

by:mmcw
Comment Utility
But how to make it work so it would produce:


<br/>this is
<br/>this is<br>a test for doing <b>new test</b>
<br/>this is<br>a test for doing <b>new test</b><br />a break bla
<br/>this is<br>a test for doing <b>new test</b><br />a break bla<br/>bla

??
0
 
LVL 28

Assisted Solution

by:FishMonger
FishMonger earned 50 total points
Comment Utility
Well, after reviewing what inq123 pointed out about my regex, I think I'm going have to admit that you need to do it with 2 regex's.  I would recommend 2 minor additions to inq123's script.  1) Add the beginning of line anchor to the regex (which only serves to make the match succeed faster).  2) Unless you need/want to, don't print the empty string.  So, my update to inq123's script would look like this:

$r_rowdata->{'Description'} = "<br/>this is<br>a test for doing<b>new test</b><br />a break bla<br/>bla<br>abc<br/>def";

$n = 3;
$r_rowdata->{'Description'} =~ /^(?:.*?<\s*br\s*\/?\s*>){$n}/is;
my $tmp = $&;
$tmp =~ s/<\s*br\s*\/?\s*>$//;
print "$tmp\n" unless $tmp =~ /^$/;


Putting this updated script of inq123's into a loop like I did for my script produced this:
<br/>this is
<br/>this is<br>a test for doing<b>new test</b>
<br/>this is<br>a test for doing<b>new test</b><br />a break bla
<br/>this is<br>a test for doing<b>new test</b><br />a break bla<br/>bla
0
 
LVL 20

Expert Comment

by:jmcg
Comment Utility
This has gone on pretty long.

My approach, since I'm not overly worried about making this all fit into one line or one regular expression, is to use split with a count and with parens in the split pattern.

$r_rowdata->{'Description'} = "this is<br>a test for doing<br>a break bla<br>bla.";

@parts = split /(<\s*br\s*\/?\s*)/i, $r_rowdata->{Description}, 3;

This gives an array of 5 elements, the first three of which contain the parts that are needed to reconstruct the original string up to the second break.

print splice( @parts, 0, -2);

or, to put them into a string,

$str = join '', splice(@parts, 0, -2);

That was for what mmcw originally parameterized a $n == 2. For other values of $n, replace the "3" at the end of the split command with ($n + 1). The split will yield an array with (2*$n)+1 elements; the last element contains the parts of the string we're not currently interested in and the next to the last element contains the nth occurrence of the split pattern, which was to be left off of the final output. Therefore, the -2 on the splice is constant, not related to $n.

While you can get into arcane aspects of regular expressions even with split, I think expressing the problem this way can always use simpler regular expressions than the pattern-match-only approaches.


0
 

Author Comment

by:mmcw
Comment Utility
Thank you both!
I will split the point!
0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility
Glad I was able to help (although, inq123 might say I was a hindrance) :-)

jmcg made several good points; you might want to take a look at his approach (I think I like it best).
0
 
LVL 8

Expert Comment

by:inq123
Comment Utility
As much as I like jmcg's speed and courtesy in posts and cleaning up perl area ( :-) ), I don't think his points are the best for this question (in fact I found the split and join approach not really saving complexity on regex (mine only has an extra {$n}) but wasted time on processing, while gaining no practical flexibility because when do you ever want to do arbitrary joins like that to html code splitted by <br>?).  Granted, I AM biased and many shortcomings might be said of my approach ... ;-)

I don't think you're a hindrance FishMonger.  I do find your always-on-the-search-for-best-approach and never-shy-away-from-exploring attitude likable, although sometimes your posts did complicate things.

I am pretty happy that this thread is finally coming to an end, as it took 10 times more time as I thought it would (I thought my first post already solved it albeit with a small bug, and a later post fixed that bug, but turns out we together posted like 20 posts). :-)  Glad it worked out eventually and mmcw got the answer.
0
 
LVL 20

Expert Comment

by:jmcg
Comment Utility
On this line, the regular expression was missing the terminating > inside the parens. It should look like:

@parts = split /(<\s*br\s*\/?\s*>)/i, $r_rowdata->{Description}, 3;

(Even when I test things, I still make mistakes transcribing...!)
0
 

Author Comment

by:mmcw
Comment Utility
FishMonger & inq123:

I am using the following code:


$r_setup->{'break_description'} = 2;
$r_rowdata->{'Description'} = "cijfer 2000 kaarsen<br />Per stuk afmeting: 22 cm * 15 cm";

$r_rowdata->{'Description'} =~ /(?:.*?<\s*br\s*\/?\s*>){$r_setup->{'break_description'}}/gis;
($r_rowdata->{'Description'} = $&) =~ s/<\s*br\s*\/?\s*>$//;

But it will not return anything when there are nNO two <br> tags! BUT it then has to return everything!

0
 
LVL 28

Expert Comment

by:FishMonger
Comment Utility

$r_setup->{'break_description'} = 2;
$r_rowdata->{'Description'} = "cijfer 2000 kaarsen<br />Per stuk afmeting: 22 cm * 15 cm";

if ($r_rowdata->{'Description'} =~ /(?:.*?<\s*br\s*\/?\s*>){$r_setup->{'break_description'}}/gis) {
   ($r_rowdata->{'Description'} = $&) =~ s/<\s*br\s*\/?\s*>$//;
}
print $r_rowdata->{'Description'};

**outputs**
cijfer 2000 kaarsen<br />Per stuk afmeting: 22 cm * 15 cm
0
 

Author Comment

by:mmcw
Comment Utility
thanks!!!!
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

I have been pestered over the years to produce and distribute regular data extracts, and often the request have explicitly requested the data be emailed as an Excel attachement; specifically Excel, as it appears: CSV files confuse (no Red or Green h…
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now