Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CPernet/e037df46e064ca83a49fb4c595d4566a to your computer and use it in GitHub Desktop.
Save CPernet/e037df46e064ca83a49fb4c595d4566a to your computer and use it in GitHub Desktop.
MATLAB function to rename all three files of a BrainVision EEG dataset. It also updates the details inside the files.
function rename_brainvision_files(varargin)
% RENAME_BRAINVISION_FILES renames a BrainVision EEG dataset, which consists of a vhdr header
% file, vmrk marker file and a data file that usually has the extension dat, eeg or seg.
%
% Use as
% rename_brainvision_files(oldname, newname, 'rmf', 'on')
% where both the old and the new filename should be strings corresponding to the
% header file, i.e. including the vhdr extension.
% 'rmf' option indicates to remove old files and can be turned 'on' of 'off' (default)
%
% See also http://www.fieldtriptoolbox.org/ and https://sccn.ucsd.edu/wiki/EEGLAB for
% open source software to process BrainVision EEG data.
%
% Robert Oostenveld https://gist.github.com/robertoostenveld/e31637a777c514bf1e86272e1092316e
%% deal with inputs
rmf = 'off'; % by default do not delete files
if nargin >= 3
if strcmpi(varargin{3},'rmf')
if nargin == 3
disp('no value associated to the remove file option, assumning off')
else
rmf = varargin{4};
end
else
error(['unrecognized option argument ''' varargin{3} ''''])
end
end
oldheaderfile = varargin{1};
newheaderfile = varargin{2};
clear varargin
% determine whether the file extensions should be in lower or upper case
if ~isempty(regexp(newheaderfile, 'VHDR$', 'once'))
switchcase = @upper;
else
switchcase = @lower;
end
% determine the filename without extension
[~, f, ~] = fileparts(newheaderfile);
%% do the renaming
% deal with the header file
assert(exist(oldheaderfile, 'file')~=0, 'the file %s does not exists', oldheaderfile);
assert(exist(newheaderfile, 'file')==0, 'the file %s already exists', newheaderfile);
fid1 = fopen(oldheaderfile, 'r'); % read old
fid2 = fopen(newheaderfile, 'w'); % write new
while ~feof(fid1)
line = fgetl(fid1);
if ~isempty(regexp(line, '^MarkerFile', 'once'))
[~, rem] = strtok(line, '=');
oldmarkerfile = rem(2:end);
[~, ~, x] = fileparts(oldmarkerfile);
newmarkerfile = [f switchcase(x)];
line = sprintf('MarkerFile=%s', newmarkerfile);
elseif ~isempty(regexp(line, '^DataFile', 'once'))
[~, rem] = strtok(line, '=');
olddatafile = rem(2:end);
[~, ~, x] = fileparts(olddatafile);
newdatafile = [f switchcase(x)];
line = sprintf('DataFile=%s', newdatafile);
end
fprintf(fid2, '%s\r\n', line);
end
fclose(fid1);
fclose(fid2);
% deal with the marker file
if exist(oldmarkerfile, 'file') == 0
[~,~,ext] = fileparts(oldmarkerfile);
[~, ff, ~] = fileparts(oldheaderfile); % re-reading as sometimes weird names comes up
if exist([ff ext], 'file')
oldmarkerfile = [ff ext];
else
error('the file %s does not exists', oldmarkerfile);
end
end
assert(exist(newmarkerfile, 'file')==0, 'the file %s already exists', newmarkerfile);
fid1 = fopen(oldmarkerfile, 'r');
fid2 = fopen(newmarkerfile, 'w');
while ~feof(fid1)
line = fgetl(fid1);
if ~isempty(regexp(line, '^HeaderFile', 'once'))
[~, rem] = strtok(line, '=');
oldheaderfile = rem(2:end);
[~, ~, x] = fileparts(oldheaderfile);
newheaderfile = [f switchcase(x)];
line = sprintf('HeaderFile=%s', newheaderfile);
elseif ~isempty(regexp(line, '^DataFile', 'once'))
[~, rem] = strtok(line, '=');
olddatafile = rem(2:end);
[~, ~, x] = fileparts(olddatafile);
newdatafile = [f switchcase(x)];
line = sprintf('DataFile=%s', newdatafile);
end
fprintf(fid2, '%s\r\n', line);
end
fclose(fid1);
fclose(fid2);
% deal with the data file
if exist(olddatafile, 'file') == 0
[~,~,ext] = fileparts(olddatafile);
[~, ff, ~] = fileparts(oldheaderfile); % re-reading as sometimes weird names comes up
if exist([ff ext], 'file')
olddatafile = [ff ext];
else
error('the file %s does not exists', oldmarkerfile);
end
end
assert(exist(newdatafile, 'file')==0, 'the file %s already exists', newdatafile);
status = copyfile(olddatafile, newdatafile);
if ~status
error('failed to copy data from %s to %s', olddatafile, newdatafile);
end
%% delete old files *try* in case of user restriction
if strcmpi(rmf,'on')
try delete(oldheaderfile); end
try delete(oldmarkerfile); end
try delete(olddatafile); end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment