Q: Get a field value to rename a file. I received a file with a specific filename every week which goes through various processes, after I have finished I need to send the original data with some extra data columns generated by our process back to the client using the original filename. Unfortunately, I cannot keep hold of the filename throughout the process but I can have a column in the return file which contains the original filename. Is there a way I can use Filmover to have a look at a specific column of a data file get the contents of it and use it to rename the file to that value then deleted the column that I got the information from? Bit complex but I thought I’d ask before exploring other avenues. The column that contains the original filename to be used and then deleted is called IMPNAME.
A: Should be possible (we received an example file of the customer).
- Please set filename filter to *.csv
- Add ‘Pascal Script’ as Destination:
- Don’t forget to adjust the ctOutputPath Const (must end with a \ )
Var
iEntry, iIndex, iList: Integer;
tmpFilename, tmpInputFile, tmpOutputFile: String;
tmpEntryList, tmpFileList: TStringList;
Const
ctOutputPath = 'C:\Test\Out_Csv\'; // Must end with a \
ctIMPNAME = 'IMPNAME';
Begin
psExitCode := 0;
iIndex := -1;
tmpInputFile := psFilePath + psFilename;
tmpOutputFile := '';
// ... add your code here
tmpEntryList := TStringList.Create;
tmpEntryList.Delimiter := ',';
tmpEntryList.StrictDelimiter := True;
tmpEntryList.QuoteChar := '"';
tmpFileList := TStringList.Create;
Try
Try
tmpFileList.LoadFromFile(tmpInputFile);
tmpEntryList.DelimitedText := tmpFileList.Strings[0];
For iEntry := 0 to (tmpEntryList.Count - 1) Do
Begin
If SameText(ctIMPNAME, tmpEntryList.Strings[iEntry]) Then
Begin
iIndex := iEntry;
psLogWrite(1, '', 'Found ' + ctIMPNAME + ' at Column with Index ' + IntToStr(iIndex));
Break;
End;
End;
// Did we find 'IMPNAME'
If iIndex <> -1 Then
Begin
tmpFileList.Strings[0] := psStringReplace(tmpFileList.Strings[0], ',"' + ctIMPNAME + '"', '');
For iList := 1 to (tmpFileList.Count - 1) Do
Begin
tmpEntryList.DelimitedText := tmpFileList.Strings[iList];
If tmpEntryList.Count > iIndex Then
Begin
If tmpOutputFile = '' Then
Begin
tmpFilename := tmpEntryList.Strings[iIndex];
If tmpFilename <> '' Then
tmpOutputFile := ctOutputPath + tmpFilename + '.csv';
End;
If tmpFilename <> '' Then
Begin
tmpFileList.Strings[iList] := psStringReplace(tmpFileList.Strings[iList], ',"' + tmpFileName + '"', '');
psLogWrite(1, '', 'Entry: ' + tmpOutputFile + ' : ' + tmpFileList.Strings[iList]);
End;
End;
End;
End;
// Save To File
If tmpOutputFile <> '' Then
Begin
Try
tmpFileList.saveToFile(tmpOutputFile);
psExitCode := 1;
Except
psLogWrite(1, '', 'Error saving file: ' + tmpOutputFile);
End;
End;
Except
psLogWrite(1, '', 'Error loading file: ' + tmpInputFile);
End;
Finally
tmpEntryList.Free;
tmpFileList.Free;
End;
End.
#filetransfer #mft #filemanagement #csv
Best regards,
Limagito Team