Вот решение, предложенное здесь для людей, которые сталкиваются с той же проблемой.
Вам нужно иметь файл setup.py в том же каталоге, что и файл, который вы запускаете, при условии, что файл имеет все шаги луча.
import setuptools
setuptools.setup(
name='whatever-name',
version='0.0.1',
install_requires=[
'apache-beam==2.10.0',
'tensorflow-transform==0.12.0'
],
packages=setuptools.find_packages(),
)
В файле python у меня было
options = PipelineOptions()
, которое нужно было изменить на:
options = PipelineOptions(setup_file="./setup.py")
Функциональный Timotei отправил, даст Вам длину строки пока часть строки, которой Вы интересуетесь, только содержит пробелы, которые, если Вы присваиваете значения в программе, должны быть верными, поскольку ФОРТРАН, как предполагается, инициализирует переменные, чтобы быть пустым и для символов, который означает пространство.
Однако, если Вы читаете в из файла, Вы могли бы взять другие управляющие символы в конце строк (особенно возврат каретки и/или символы перевода строки, \r и/или \n в зависимости от Вашей ОС). Необходимо также выбросить тех, которые в функции для получения корректной длины строки. Иначе Вы могли получить некоторые забавные операторы печати, поскольку те символы печатаются также.
Вот моя версия функции, которая проверяет на альтернативные пробельные символы в конце помимо пробелов.
function strlen(st)
integer i,strlen
character st*(*)
i = len(st)
do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or.
+ (st(i:i).eq.'\n').or.(st(i:i).eq.'\t'))
i = i - 1
enddo
strlen = i
return
end
Если будут другие символы в разделе "мусора", то это все еще не будет работать полностью.
Предположение, что это действительно работает на Ваши данные, однако, можно затем изменить оператор записи для сходства с этим:
write(*,*) matname(matidx)(1:strlen(matname(matidx)))
и это распечатает просто фактическую строку.
Относительно того, необходимо ли использовать другой массив для содержания длин строки, которая ваше дело. strlen () функция является O (n), тогда как поиск длины в таблице является O (1). При нахождении длин этих статических строк часто это может улучшить производительность для вычислений длины однажды, когда они читаются в, хранят их в массиве и ищут их при необходимости в них. Однако, если бы Вы не замечаете замедление, я не волновался бы об этом.
Можно использовать эту функцию для получения длины (без пустого хвоста)
integer function strlen(st)
integer i
character st*(*)
i = len(st)
do while (st(i:i) .eq. ' ')
i = i - 1
enddo
strlen = i
return
end
Добрался отсюда: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html
PS: Когда Вы говорите: matname (matidx) это получает целую строку (256) символы... так, чтобы была Ваша строка плюс пробелы или мусор
В зависимости от компилятора, который Вы используете, Вы можете использовать trim()
встроенная функция для удаления любого продвижения/конечных пробелов из строки затем обработайте его, как Вы обычно были бы, т.е.
character(len=25) :: my_string
my_string = 'AIR'
write (*,*) ':', trim(my_string), ':'
должен распечатать :AIR:
.
Править: Еще лучше похоже, что существует a len_trim()
функция, которая возвращает длину строки после того, как она была обрезана.