简体   繁体   中英

C# stringbuilder + conversion

What I have going on is this:
1) Reading a directory of files
2) Writing out to a text file the filenames + "|"
3) Where i'm stuck.....

I have a bunch of files named... and need to be converted corispondingly: Apple0154~3.Txt convertedTO -> Apple0156.txt
Apple0136~31.txt convertedTO -> Apple0166.txt

The prefix is always apple so it kinda goes like:
Apple (always the same prefix). The numbers match is # + ~ subnumber -1 always in in .txt

I'm sure this is confusing i'm using this code but i cant figured out how to get this resulting textfile:
Apple0154~3.Txt|Apple0156.txt
Apple0136~31.txt|Apple0166.txt

{
            string resultingfile = ***This is what i dont know***
            string movedredfolder = (overlordfolder + "\\redactions\\");
            DirectoryInfo movedredinfo = new DirectoryInfo(movedredfolder);
            using (StreamWriter output = new StreamWriter(Path.Combine(movedredfolder, "Master.txt")))
            {
                foreach (FileInfo fi in movedredfolder)
                {
                    output.WriteLine(Path.GetFileName(fi)+"|"+resultingfile);
                }
            }
        }

Ok, I see what you are trying to do.

Try using Regular expressions to grab the 2 numbers out of the original file name. Something like:

Regex r = new Regex(@"Apple(\d+)~(\d+)\.txt");
Match mat = r.Match(filename);

if( !mat.Success )
{
    // Something bad happened...
    return;
}

int one = int.Parse(mat.Groups[1].Value);
int two = int.Parse(mat.Groups[2].Value);
int num = one + (two-1);

string newFilename = "Apple"+num.ToString("0000")+".txt";

Inside the foreach loop:

   string fileName = Path.GetFileName(fi);
   string[] parts = fileName.Split('~', '.');
   int basenum = int.Parse(parts[0].Substring(6));
   int offset = int.Parse(parts[1]);
   string resultingfile = string.Format("Apple{0:0000}.txt", basenum+offset-1);

euh something like:

 string path = Path.GetFileName(fi);
 int indexOfTilde = path.IndexOf('~');
 int indexOfPoint = path.LastIndexOf('.');
 int length = indexOfPoint -indexOfTilde; 
 string tmp = path.SubString(indexOfTilde+1, length);
 int numberToIncrease = Convert.ToInt32(tmp) - 1;
 int baseNumber = Convert.ToInt32(path.SubString(5, indexOfTilde-4);
 string newPath = "Apple" + (baseNumber + numberToIncrease ) + ".txt";

and you can use the FileInfo.MoveTo for file movement :) good luck!

edit: damn... too slow typing of me...

Ok, this should work for one file:

String filename = "Apple0154~3.Txt";
Regex re = new Regex(@"Apple(?<num>\d+)\~(?<add>\d+)");

Int32 num = Int32.Parse(re.Match(filename).Groups["num"].Value);
Int32 add = Int32.Parse(re.Match(filename).Groups["add"].Value);

Int32 rez = num + (add - 1);
MessageBox.Show("Apple" + rez + ".txt");
using (var output = new StreamWriter(Path.Combine(movedredfolder, "Master.txt")))
{
    foreach (var filePath in Directory.GetFiles(directoryPath))
    {
        var fileName = Path.GetFileNameWithoutExtension(filePath);
        var fileExtension = Path.GetExtension(filePath);
        var index = fileName.IndexOf('~'); 
        var firstNumber = Int32.Parse(fileName.Substring(5, index - 1)); 
        var secondNumber = Int32.Parse(fileName.Substring(index + 1)) - 1;
        output.Write("Apple0" + 
            (firstNumber + secondNumber).ToString() +
            fileExtension + "|"
        );
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM