Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

There are some files in a directory. I have used of SetDiroctory to access all of them.

SetDirectory["C:\\Users\\SE7EN\\Desktop\\mathematica\\test"];

I can visit all theirs contents with

filenames = FileNames[]
{"Ronaldo.txt", "Messi.txt", "Beckenbauer.txt", "Zeydane.txt"}
loaddata[filenumber_] := Import[Part[FileNames[], filenumber]]

For example:

loaddata[4]     2    8    7     13   77

These are contents of Zeydane file. But I want to have imported files with the respectively devoted names. For example, desired result after that process, (which I do not know how it can be done), be same as bellow:

Ronaldo={2,3,5,8,0,1}
Messi={21,2,45,6}
Beckenbauer={11,42,5,2,7,21}
Zeydane={2,8,7,13,77}

One way is: importing them separately, Messi=Import{.....,'data'}. But it is not the desired process, The desired process must be done automatically. Automatically importing data from directory and devoting their names in that directory to the imported list.

Thanks in advance.

share|improve this question
3  
FileBaseName is useful to remove file suffixes. –  Yves Klett Jun 4 at 14:36
    
uh, and the leading stuff as well, of course ;-) –  Yves Klett Jun 4 at 15:20
    
Thanks a bunch for your comments and answer. Please let me check your propose to my goal. –  mostafa Jun 4 at 15:25

2 Answers 2

up vote 2 down vote accepted

I like Yves Klett's method a lot, and if you are making the kind of substitutions he illustrates it is the way to go. However here is how to do just what you requested, as well as another alternative using "indexed objects."

Set @@ Append[ToHeldExpression @ FileBaseName @ #, Import @ #] & /@ filenames

(ToHeldExpression is a deprecated function but still entirely usable and handy.)

And now indexed objects with strings as keys:

(data[FileBaseName @ #] = Import[#]) & /@ filenames

This is used with e.g.:

data["Ronaldo"]
{2,3,5,8,0,1}
data /@ {"Beckenbauer", "Zeydane"}
{{11, 42, 5, 2, 7, 21}, {2, 8, 7, 13, 77}}
share|improve this answer
    
Blush :D Any particular reason not to use ToExpression? –  Yves Klett Jun 5 at 19:47
1  
@Yves I presume you mean in place of ToHeldExpression etc.? Only that if those Symbols are already assigned, e.g. if you externally update the files then attempt to reload them, it will fail. –  Mr.Wizard Jun 6 at 1:19

Instead of generating hardcoded variables and cluttering your namespace, I would suggest you try this:

names = {"a.txt", "b.txt", "c.txt"};
vals = {1, 2, 3};
vars = ToExpression[FileBaseName /@ names];
data=Thread[vars -> vals]

{a -> 1, b -> 2, c -> 3}

This allows for comfortable further calculations together with ReplaceAll and similar and will empower your football algebra:

a*b*c/.data

6

Leaving the variable names in their string representation will work as well. More typing will be involved, but the process will be more robust with respect to name clashes (you will probably be safe with Beckenbauer though...)

names = {"a.txt", "b.txt", "c.txt"};
vals = {1, 2, 3};
vars = FileBaseName /@ names;
data = Thread[vars -> vals]
"a"*"b"*"c" /. data

{"a" -> 1, "b" -> 2, "c" -> 3}

6

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.