如何通过服务将列表字段重组至指定固定位置?
Looks like you need to map specific fields (Account, CNPj, INVOICE) from your list into fixed position ranges—like placing the transferor code (I’m assuming that’s your CNPj field?) into positions 002 to 003. Here’s a practical, code-driven approach to build that service:
Start by clearly mapping each field to its target position range. Note: I’ll use 0-based indexing here (adjust to 1-based if your system requires it—just shift the start/end values by 1). For example:
- Account: Positions 0–1 (covers the first two slots)
- Transferor Code (CNPj): Positions 2–3 (matches your 002–003 requirement)
- INVOICE (Amount): Positions 4–10 (reserves 7 slots for the amount)
Store these rules in a dictionary for easy reference in your service:
position_rules = { "Account": (0, 1), "CNPj": (2, 3), "INVOICE": (4, 10) }
Create a function that takes your original field data and the position rules, then builds the fixed-position output. It handles padding/truncating values to fit their assigned ranges:
def rearrange_to_fixed_positions(original_fields, position_rules): # Calculate the total number of positions needed max_position = max(end for _, (start, end) in position_rules.items()) result = [''] * (max_position + 1) # Empty placeholder for each position for field_name, value in original_fields.items(): start_pos, end_pos = position_rules[field_name] field_length = end_pos - start_pos + 1 # Format the value to fit the position range: # - Left-align text fields (like Account/CNPj) and pad with spaces # - Right-align numeric fields (like INVOICE) and pad with zeros if field_name == "INVOICE": formatted_value = str(value).rjust(field_length, '0')[:field_length] else: formatted_value = str(value).ljust(field_length)[:field_length] # Place each character of the formatted value into its target position for idx in range(field_length): result[start_pos + idx] = formatted_value[idx] # Join the positions into a single structured string (or return the list if needed) return ''.join(result)
Use your actual field data to test the function:
# Your original field list (represented as a dict for clarity) original_data = { "Account": "ACC123", "CNPj": "1234", "INVOICE": "98765.43" } # Generate the fixed-position output fixed_output = rearrange_to_fixed_positions(original_data, position_rules) print(f"Fixed-position result: '{fixed_output}'")
This will output: 'AC1298765.4' (breakdown: AC from Account, 12 from CNPj, 98765.4 from INVOICE—all fitting their assigned ranges).
Don’t forget to add safeguards for common scenarios:
- If a field value is shorter than its assigned range: The code pads with spaces (or zeros for numbers) to fill the gap.
- If a field value is longer than its range: It truncates the excess characters to avoid overflowing into other positions.
- If a required field is missing: Add a check at the start of the function to raise an error or fill with a default value (e.g.,
'XX'for missing CNPj).
内容的提问来源于stack exchange,提问作者Fernando Eduardo

