[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: OT: Getting MySQL fields with embedded spaces into array
From: |
Chris F.A. Johnson |
Subject: |
Re: OT: Getting MySQL fields with embedded spaces into array |
Date: |
Thu, 29 Oct 2009 16:08:29 -0400 (EDT) |
User-agent: |
Alpine 2.00 (LMD 1167 2008-08-23) |
On Thu, 29 Oct 2009, Greg Wooledge wrote:
> On Thu, Oct 29, 2009 at 11:49:11AM -0400, Gerard wrote:
> > Are you sure? Using: IFS=$(echo) seems to set IFS to a newline here.
>
> imadev:~$ IFS=$(echo)
> imadev:~$ printf "%s" "$IFS" | od -t x1
> 0000000
> imadev:~$ printf "\n" | od -t x1
> 0000000 a
> 0000001
> imadev:~$ echo ${#IFS}
> 0
> imadev:~$ unset IFS
>
> Also, this section of the manual is quite clear:
>
> Bash performs the expansion by executing command and replacing the
> command substitution with the standard output of the command, with any
> trailing newlines deleted.
>
> > I got some great ideas from your page. However, I have not been able
> > to figure out how to save the results of the MySQL search, one that
> > might include spaces in the data, and inset it into an array without
> > creating a temp file and then using read to put it into an array.
>
> Well, there are two different issues here (that I can see -- possibly more).
> The first is, "How do I get the results of a data stream into an array?"
> This can be done with a temp file or a FIFO, or with what bash calls
> "process substitution" which is basically a FIFO that bash creates for
> you (although the actual implementation varies across platforms). It
> looks like this:
>
> while read -r; do
> arr[i++]=$REPLY
Or:
arr+=( "$REPLY" )
> done < <(your mysql command)
Or, in bash4:
mapfile -t arr < <(your mysql command)
> This assumes a newline delimiter between array elements (lines of the
> data stream). It's on BashFAQ/005 though you may have missed it. I'll
> take a look at the wording and see if it's unclear, or needs additional
> pointers to other pages.
>
> The other issue is "I have database fields that can contain whitespace,
> and I want to read them in, while still retaining knowledge of where each
> field begins and ends." This one is much more insidious.
>
> In the general case, if your SQL select statement returns two "varchar"
> fields that can contain arbitrary characters, there is no way to know
> where the first field ends and the second one begins.
>
> The solution to this is:
>
> * Only perform SQL select statements that return data of fixed size,
> or a single isolated data field; or
> * Move to a language that can call the database API directly.
>
> > //snippet//
> >
> > ## Connect to the SQL server and store the contents of the query in an array
> >
> > SIGS=$(mysql ${COM_LINE} -e"use ${DB}; SELECT sig from ${table} WHERE
> > sig_file='0';")
>
> That is not an array. It's just a string (scalar) variable.
>
> > ## Set IFS = line feed or else the array will not load correctly
> > IFS=$(echo)
>
> This actually sets IFS to an empty string, not a newline.
Besides the methods already shown:
printf -v IFS "\n"
--
Chris F.A. Johnson, webmaster <http://woodbine-gerrard.com>
===================================================================
Author:
Shell Scripting Recipes: A Problem-Solution Approach (2005, Apress)
Pro Bash Programming: Scripting the GNU/Linux Shell (2009, Apress)